home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / 172bbas.zip / RBBS-PC.BAS < prev    next >
BASIC Source File  |  1989-07-30  |  152KB  |  4,600 lines

  1. 3 ' $linesize: 132
  2. 4 ' $title: 'RBBS CPC17.2B, Copyright 1989 by D. Thomas Mack'
  3. 5 ' WARNING !!! DO NOT CHANGE, BYPASS OR REMOVE LINES 3-29
  4. 9 'by D. Thomas Mack, 39 Cranbury Drive, Trumbull, CT 06611
  5. 11 '  Ken Goosens, 5020 Portsmouth Road, Fairfax, VA 22032
  6. 13 '
  7. 14 ' *******************************NOTICE*************************************
  8. 15 ' *  A limited license is granted to all users of this program and it's    *
  9. 16 ' *  companion program, CONFIG (version 17.2B), to make copies of this     *
  10. 17 ' *  program and distribute the copies to other users, on the following    *
  11. 18 ' *  conditions:                                                           *
  12. 19 ' *    1.   The notices contained in lines 3 through 29 of the program     *
  13. 20 ' *         are not altered, bypassed, or removed.                         *
  14. 21 ' *    2.   The program is not to be distributed to others in modified     *
  15. 22 ' *         form (i.e. the line numbers must remain the same).             *
  16. 23 ' *    3.   No fee is to be charged (or any other consideration received)  *
  17. 24 ' *         for copying or distributing these programs without an express  *
  18. 25 ' *         written agreement with D. Thomas Mack, The Second Ring, 39     *
  19. 26 ' *         Cranbury Drive, Trumbull, Conneticut 06611                     *
  20. 27 ' *                                                                        *
  21. 28 ' *       Copyright (c) 1983-1989 D. Thomas Mack, The Second Ring          *
  22. 29 ' **************************************************************************
  23.    '
  24.    ' $INCLUDE: 'RBBS-VAR.BAS'
  25.    '
  26.    ' $SUBTITLE: 'Main-line RBBS-PC Program'
  27.     CRLF$ = CHR$(13) + CHR$(10)
  28.     J = 60
  29.     REDIM OPT.SEC(J)
  30.     CONFIG.FILENAME$ = "RBBS-PC.DEF"
  31.     CALL GETCOMND (DEBUG,NETIME$,NETBAUD$,NETRELIABLE$)
  32.     SUBROUTINE.PARAMETER = -62
  33.     BULLETIN.MENU$ = ""
  34.     CALL READDEF (CONFIG.FILENAME$)
  35.     IF EC > 0 THEN _
  36.        GOTO 31
  37.     CALL MLINIT (1)
  38.     SUBROUTINE.PARAMETER = -9
  39.     CALL CARRIER
  40.     IF SUBROUTINE.PARAMETER THEN _
  41.        CALL COPYWRIT
  42.     GOTO 100
  43. 31  SNOOP = -1
  44.     CALL PSCRN ("Configuration "+CONFIG.FILENAME$+" missing or improper format.") : _
  45.     GOTO 204
  46. 100 CLEAR,,SIZE.OF.STACK
  47.     DEF SEG                            ' Point to BASIC
  48.     WIDTH 80                           ' Set Screen Width
  49.     SCREEN 0,0,0                       ' Text, No color, Pg 0
  50.     KEY OFF                            ' Line 25 turned off
  51.     DEFINT A-Z                         ' All var. integer
  52. ' ********************* Variable Definitions *******************************
  53. 102 ADIM = 99
  54.     MM = 999
  55.     BX = 75
  56.     J = 60
  57.     REDIM OPT.SEC(J)
  58.     REDIM CATEGORY.NAME$(BX),CATEGORY.CODE$(BX),CATEGORY.DESC$(BX)  ' KG052401
  59.     REDIM A$(ADIM)                      ' Message line table
  60.     REDIM B$(ADIM)                      ' Message line table
  61.     REDIM M(MM,2)                       ' Message pointers
  62.     J = 13
  63.     REDIM WORK.ARA$(J)
  64.     REDIM GSR.ARA$(J)
  65.     CALL VARINIT
  66. 105 VERSION.ID$ = "CPC17.2B"
  67. 106 CALL GETCOMND (DEBUG,NETIME$,NETBAUD$,NETRELIABLE$)
  68.     SUBROUTINE.PARAMETER = 1
  69.     CALL READDEF (CONFIG.FILENAME$)
  70.     IF EC > 0 THEN _
  71.        GOTO 31
  72.     USE.TPUT = (UPPER.CASE OR XON.XOFF)
  73.     ORIG.UPGRADE.SEC = AUTO.UPGRADE.SEC
  74.     ORIG.CALLERS$ = CALLERS.FILE$
  75.     ORIG.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  76.     ORIG.USER.FILE$ = MAIN.USER.FILE$
  77.     ORIG.MIN.SEC = MINIMUM.LOGON.SECURITY
  78.     ORIG.SYSOP.FN$ = SYSOP.FIRST.NAME$
  79.     ORIG.SYSOP.LN$ = SYSOP.LAST.NAME$
  80.     EXPERT.USER = EXPERT.USER.DEF
  81.     PROMPT.BELL = PROMPT.BELL.DEF
  82.     CALL BRKFNAME (ORIG.MESSAGE.FILE$,DRV$,ORIG.MSG.NAME$,Y$,FALSE)
  83.     IF ORIG.MSG.NAME$ = "MESSAGES" THEN _
  84.        ORIG.MSG.NAME$ = "MAIN" _
  85.     ELSE IF RIGHT$(ORIG.MSG.NAME$,1) = "M" THEN _
  86.             ORIG.MSG.NAME$ = LEFT$(ORIG.MSG.NAME$,LEN(ORIG.MSG.NAME$)-1)
  87.     GRN.NAME$ = ORIG.MSG.NAME$
  88.     IF NET.MAIL$ <> "NONE" AND VAL(NETIME$) > 0 THEN _
  89.        LIMIT.MINUTES.PER.SESSION! = VAL(NETIME$)
  90.     IF NET.MAIL$ <> "NONE" AND VAL(NETBAUD$) > 0 THEN _
  91.        EXPECT.ACTIVE.MODEM = TRUE : _
  92.        IF NOT KEEP.INIT.BAUD THEN _
  93.           MODEM.INIT.BAUD$ = NETBAUD$
  94.     IF FOSSIL THEN _
  95.        COMPORT% = VAL(RIGHT$(COM.PORT$,1)) - 1 : _
  96.        IF COMPORT% < 0 THEN _
  97.           GOTO 108 _
  98.        ELSE CALL FOSINIT(COMPORT%,RESULT%) : _
  99.             IF RESULT% = -1 THEN _
  100.                SNOOP = TRUE : _
  101.                CALL PSCRN("ERROR INITIALIZING FOSSIL") : _
  102.                GOTO 204
  103. 108 CALL BRKFNAME (CALLERS.FILE$,DRV$,X$,Y$,TRUE)
  104.     CALLERS.FILE.PREFIX$ = X$
  105.     ARC.WORK$ = DRV$ + _
  106.                 "ARCWORK" + _
  107.                 NODE.FILE.ID$ + _
  108.                 ".DEF"
  109.     IF USE.BASIC.WRITES THEN _
  110.        LOCAL.BACKSPACE$ = BACK.ARROW$ _
  111.     ELSE LOCAL.BACKSPACE$ = BACKSPACE$
  112.     SYSOP.FULL.NAME$ = LEFT$(SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$,22)
  113. '
  114. ' *****  INITIALIZE NETBIOS INTERFACE   ****
  115. '
  116.    IF NETWORK.TYPE = 6 AND NOT SUB.BOARD THEN _
  117.       CALL INITIBM
  118. '
  119. ' *****  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE   ***
  120. '
  121.     CALL SETCALL
  122. 112 IF NOT SUB.BOARD THEN _
  123.        LOCAL.USER = TRUE : _
  124.        A$ = COLOR.RESET$ : _
  125.        SUBROUTINE.PARAMETER = 1 : _
  126.        CALL TPUT : _
  127.        LOCAL.USER = FALSE
  128.     UPLOAD.DRIVE.FILE$ = RIGHT$(DOWNLOAD.DRIVES$,1)+":FREESPAC.UPL"
  129.     MINUTES.PER.SESSION.DEF! = MINUTES.PER.SESSION!                  ' KG072604
  130.     MAX.PER.DAY.DEF = MAX.PER.DAY                                    ' KG072604
  131. '
  132. ' *****  TEST FOR MESSAGE FILE PRESENT (ABORT IF NOT PRESENT)  ****
  133. '
  134. 135 IF CURRENT.DEF$ = ORIG.CONFIG$ THEN _
  135.        ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  136.        ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  137.     GOSUB 4910
  138.     IF CONFERENCE.MODE THEN _
  139.        GOTO 150
  140.     LOCAL.USER.MODE = (RIGHT$(COM.PORT$,1) < "1")
  141.     GET 1,NODE.RECORD.INDEX
  142.     Y$ = MID$(MESSAGE.RECORD$,77,2)
  143.     CALL UNCDATE (Y$,X,L,I,OLD.DAT$)
  144.     OLD.DAT$ = LEFT$(OLD.DAT$,6) + MID$(STR$(X),2)
  145.     TIME.TO.DROP.TO.DOS = - (TIME.TO.DROP.TO.DOS > 0) * TIME.TO.DROP.TO.DOS
  146.     HR! = INT(TIME.TO.DROP.TO.DOS / 100)
  147.     MN! = TIME.TO.DROP.TO.DOS - HR! * 100
  148.     TIME.TO.DROP.TO.DOS! = HR! * 3600 + MN! * 60
  149. '
  150. ' ******  TEST FOR TIMED EXIT ACTIVE   *****
  151. '
  152. 140 CALL FINDTIME (TI!)
  153.     IF TIME.TO.DROP.TO.DOS > 0 AND _
  154.        OLD.DAT$ <> DATE$ AND _
  155.        TI! >= TIME.TO.DROP.TO.DOS! THEN _
  156.        GOTO 206
  157. '
  158. ' **** GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER
  159. '
  160. 150 IF SUB.BOARD THEN _
  161.        GOSUB 12987 : _
  162.        GOSUB 5135 : _
  163.        GOTO 170
  164.     SYSOP.AVAILABLE = VAL(MID$(MESSAGE.RECORD$,32,2))
  165.     SYSOP.ANNOY = VAL(MID$(MESSAGE.RECORD$,34,2))
  166.     SYSOP.NEXT = VAL(MID$(MESSAGE.RECORD$,36,2))
  167.     MID$(MESSAGE.RECORD$,36,2) = STR$(FALSE)
  168.     PRINTER = VAL(MID$(MESSAGE.RECORD$,38,2))
  169.     IF TURN.PRINTER.OFF THEN _
  170.        PRINTER = FALSE
  171.     EXIT.TO.DOORS = (MID$(MESSAGE.RECORD$,40,2) = "-1" AND NETBAUD$ = "")
  172.     EIGHT.BIT = VAL(MID$(MESSAGE.RECORD$,42,2))
  173.     BPS = VAL(MID$(MESSAGE.RECORD$,44,2))
  174.     SNOOP = VAL(MID$(MESSAGE.RECORD$,58,2))
  175.     MID$(MESSAGE.RECORD$,57,1) = "I"
  176.     PRIVATE.DOOR = (MID$(MESSAGE.RECORD$,72,2) = "-1")               ' KG061601
  177.     IF PRIVATE.DOOR THEN _                                           ' KG052501
  178.        HAS.PRIVDOOR = TRUE                                           ' KG052501
  179.     MID$(MESSAGE.RECORD$,72,2) = STR$(FALSE)
  180.     LOCAL.USER = (MID$(MESSAGE.RECORD$,101,2) = "-1")                ' KG061601
  181.     IF EXIT.TO.DOORS OR PRIVATE.DOOR THEN _
  182.        HAS.DOORED = TRUE : _
  183.        TURBO.LOGON = TRUE
  184.     PUT 1,NODE.RECORD.INDEX
  185.     GOSUB 12985
  186. '
  187. ' *****  INITIALIZE VOICE SYNTHESIZER   ****
  188. '
  189.     CALL TALK (INIT,A$)
  190. '
  191. ' *****  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER   ****
  192. '
  193. 160 CALL MLINIT (4)
  194. 170 FOR FUNCTION.KEY.INDEX = 1 TO 10
  195.        KEY FUNCTION.KEY.INDEX,""
  196.     NEXT
  197.     CALL LOADNEW (M())
  198. '
  199. ' ******  INITIALIZE FILE MANAGEMENT SYSTEM, CHECK FOR LOCAL BBS MODE
  200. '
  201. 175 GOSUB 5344
  202.     CALL CTLINES (MAX.ENTRIES)
  203.     REDIM CATEGORY.NAME$(MAX.ENTRIES),CATEGORY.CODE$(MAX.ENTRIES),_
  204.           CATEGORY.DESC$(MAX.ENTRIES) : _
  205.     CALL INITFMS (CATEGORY.NAME$(),CATEGORY.CODE$(), _
  206.                   CATEGORY.DESC$(),NUM.CATEGORIES)
  207.     MAX.MESSAGE.LINES = MAX.MESSAGE.LINES.DEF
  208.     LOCAL.USER = (LOCAL.USER OR LOCAL.USER.MODE)
  209.     IF (NOT LOCAL.USER) AND (NOT SUB.BOARD) THEN _
  210.        CALL OPENCOM (MODEM.INIT.BAUD$,",N,8,1")
  211.     IF NOT SUB.BOARD THEN _
  212.        CALL SETECHO (DEFAULT.ECHOER$)
  213.     CALL BRKFNAME (CALLERS.FILE$,DRV$,X$,Y$,TRUE)
  214.     NODE.WORK.FILE$ = DRV$ + _
  215.                       "NODE" + _
  216.                       NODE.FILE.ID$ + _
  217.                       "WRK"
  218.     SECONDS.PER.SESSION! = MINUTES.PER.SESSION! * 60
  219.     IF NOT LOCAL.USER.MODE THEN _
  220.        IF NOT EXIT.TO.DOORS THEN _
  221.           GOTO 180 _
  222.        ELSE IF NOT LOCAL.USER THEN _
  223.                GOTO 180
  224.     LOCAL.USER = TRUE
  225.     BPS = -6
  226.     BAUD.TEST = 9600
  227.     EIGHT.BIT = TRUE
  228.     SNOOP = TRUE
  229.     IF EXIT.TO.DOORS THEN _
  230.        CALL AMORPMTD : _                                             ' KG061203
  231.        CALL READPROF : _
  232.        GOTO 410
  233.     GOSUB 178
  234.     GOTO 345
  235. 178 IF SUB.BOARD THEN _
  236.        IF FIRST.NAME$ = SYSOP.FIRST.NAME$ AND _
  237.           LAST.NAME$ = SYSOP.LAST.NAME$ THEN _
  238.              RETURN 832 _
  239.        ELSE RETURN 800
  240.     RETURN
  241. 180 SUBROUTINE.PARAMETER = 2
  242.     CALL LINE25
  243.     GOSUB 178
  244. '
  245. ' ******  WAIT FOR THE PHONE TO RING AND ANSWER IT   ****
  246. '
  247.     SUBROUTINE.PARAMETER = 1
  248. 200 TOGGLE.ONLY = TRUE
  249.     CALL ANSWERIT
  250.     GET 1,NODE.RECORD.INDEX
  251.     SNOOP = VAL(MID$(MESSAGE.RECORD$,58,2))
  252.     TOGGLE.ONLY = FALSE
  253.     IF EC > 1 THEN _
  254.        GOTO 13000
  255.     IF SUBROUTINE.PARAMETER < 0 THEN _
  256.        GOTO 202
  257.     ON SUBROUTINE.PARAMETER GOTO 410, _   '  1 = ANSWERED PHONE & CARRIER FOUND
  258.                                  330, _   '  2 = CARRIER FOUND BEFORE ANSWERING
  259.                                  822, _   '  3 = SYSOP GETS SYSTEM NEXT
  260.                                10595, _   '  4 = ANSWERED PHONE BUT NO CARRIER
  261.                                13540, _   '  5 = NOT USED
  262.                                  202, _   '  6 = LOCAL SYSOP KEY PRESSED
  263.                                  206, _   '  7 = TIME TO DROP TO DOS
  264.                                13538      '  8 = NO CALLS! TIME TO RECYCLE
  265. 202 FF = -SUBROUTINE.PARAMETER
  266.     ON FF GOTO 10595, _   '  -1 = CARRIER DROPPED
  267.                 4770, _   '  -2 = SYSOP INITIATED CHAT
  268.                  205, _   '  -3 = FORCE SYSTEM TO ANSWER THE PHONE
  269.                  204, _   '  -4 = EXIT TO DOS IMMEDEATELY
  270.                  203, _   '  -5 = EXIT TO DOS AFTER CLEAN-UP
  271.                10698, _   '  -6 = INDICATE ACCESS IS DENIED AND LOGOFF USER
  272.                10620      '  -7 = UPDATE CALLERS FILE AND LOGOFF USER
  273. 203 CALL MLINIT(3)
  274. 204 IF FOSSIL THEN _
  275.        CALL FOSEXIT(COMPORT%)
  276.     SYSTEM
  277. 205 SUBROUTINE.PARAMETER = 4
  278.     GOTO 200
  279. 206 CALL TIMEDOUT
  280.     GOTO 203
  281. 330 CALL CARRIER
  282.     IF SUBROUTINE.PARAMETER = -1 THEN _
  283.        GOTO 10595
  284.     CALL EOFCOMM (CHAR%)
  285.     IF CHAR% = -1 THEN _
  286.        GOTO 335
  287.     CALL FLUSHCOM (DF$)
  288.     IF SUBROUTINE.PARAMETER = -1 THEN _
  289.         GOTO 10595
  290.     GOTO 330
  291. 335 EXIT.TO.DOORS = FALSE
  292.     PRIVATE.DOOR = FALSE
  293.     IF C.L <> 1 THEN _
  294.        LOCATE 22,34
  295.     D$ ="CONNECT" + _
  296.         STR$(BAUD.TEST) + _
  297.         "     "
  298.     GOSUB 1315
  299. '
  300. ' *****  DISPLAY WELCOME LINE  ****
  301. '
  302. 345 LOCATE 24,1
  303.     CALL AMORPMTD                                                    ' KG061203
  304.     CALL FINDTIME (USER.LOGON.TIME!)
  305.     TIME.LOGGED.ON$ = TIME$
  306.     LINES.PRINTED = 0
  307.     EXPERT.USER.DEF = EXPERT.USER
  308.     EXPERT.USER = FALSE
  309.     CALL SETEXPERT
  310.     IF NODES.IN.SYSTEM > 1 THEN _
  311.        A$ = " - NODE " + NODE.ID$ _
  312.     ELSE A$ = ""
  313.     CALL QTPUT1 ("WELCOME TO " + RBBS.NAME$ + A$)
  314.     TEST.PARITY = TRUE
  315.     STOP.INTERRUPTS = TRUE
  316.     FILE.NAME$ = PRELOG$
  317.     CALL FLUSHCOM (X$)
  318.     COMMPORT.STACK$ = ""
  319. 346 GOSUB 466
  320.     IF SUBROUTINE.PARAMETER = -1 THEN _
  321.        GOTO 13540
  322.     FF = FALSE
  323. '
  324. ' *****  GET USER NAME
  325. ' *****  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS)
  326. '
  327. 400 CALL SKIPLINE(1)
  328.     ESCAPE.INSECURE = FALSE
  329.     UPPER.CASE = FALSE
  330.     EXPERT.USER = EXPERT.USER.DEF
  331.     CALL SETEXPERT
  332.     A1$ = "What is your "
  333.     GOSUB 12500
  334.     CALL COMMINFO
  335.     IF FF THEN _
  336.        LOGON.ERROR.INDEX = 1 : _
  337.        GOTO 10620
  338.     IF MIN.OLDCALLER.BAUD > BAUD.TEST THEN _
  339.        CALL QTPUT (MID$(STR$(BAUD.TEST),2) + " BAUD ACCESS NOT ALLOWED!",2) : _
  340.        LG$(7) = "OLD CALLER BAUD RESTRICTION" : _
  341.        LOGON.ERROR.INDEX = 7 : _
  342.        GOTO 10620
  343.     TURBO.LOGON = (LEFT$(B$(4),1) = "!")
  344.     HOME.CONFERENCE$ = RIGHT$(B$(4),LEN(B$(4)) + TURBO.LOGON)
  345. '
  346. ' *****  CHECK IF SAME USER ON ANOTHER NODE   ***
  347. '
  348. 410 IF EXIT.TO.DOORS THEN _
  349.        CURRENT.DATE$ = MID$(MESSAGE.RECORD$,119,2) + _
  350.                        "-" + _
  351.                        MID$(MESSAGE.RECORD$,121,2) + _
  352.                        "-" + _
  353.                        MID$(MESSAGE.RECORD$,123,2) : _
  354.        TIM$ = MID$(MESSAGE.RECORD$,125,2) + _
  355.               ":" + _
  356.               RIGHT$(MESSAGE.RECORD$,2) : _
  357.        IF LEFT$(TIM$,2) < "12" THEN _
  358.           TIM$ = TIM$ + _
  359.                  " AM" _
  360.        ELSE TIM$ = TIM$ + _
  361.                    " PM"
  362.     NODE.INDEX = 2
  363.     XX = NODES.IN.SYSTEM + 1
  364. 412 IF NODE.INDEX > XX THEN _
  365.        GOTO 430
  366.     GET 1,NODE.INDEX
  367.     IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  368.        GOTO 420
  369.     NODE.INDEX = NODE.INDEX + 1
  370.     GOTO 412
  371. 420 IF MID$(MESSAGE.RECORD$,57,1) = "A" THEN _
  372.        LOGON.ERROR.INDEX = 6 : _
  373.        LG$(6) = LG$(6) + _
  374.                 LEFT$(MESSAGE.RECORD$,25) : _
  375.        A$ = "Name <" + ACTIVE.USER.NAME$ + "> in use on another node" : _
  376.        CALL RINGCALLER : _
  377.        GOTO 10620
  378.     FIRST.NAME$ = LEFT$(MESSAGE.RECORD$,INSTR(MESSAGE.RECORD$, " ") - 1)
  379.     IF NOT PRIVATE.DOOR THEN _
  380.        CALL SKIPLINE (1) : _
  381.        CALL QTPUT1 (FIRST.NAME$ + ", welcome back!") : _
  382.        CALL TALK (11,A$)
  383.     IF EXIT.TO.DOORS THEN _
  384.        GOTO 457
  385. '
  386. ' *****  TEST FOR REMOTE SYSOP LOGGING ON   ***
  387. '
  388. 430 GET 1,NODE.RECORD.INDEX
  389.     SAME.USER = (ACTIVE.USER.NAME$ = LEFT$(MESSAGE.RECORD$,LEN(ACTIVE.USER.NAME$)))
  390. '
  391. ' *****  TEST FOR SYSOP NAME ATTEMPT  ***
  392. '
  393. 445 IF INSTR(ACTIVE.USER.NAME$,"SYSOP") OR _
  394.        INSTR(ACTIVE.USER.NAME$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) THEN _
  395.        LOGON.ERROR.INDEX = 2 : _
  396.        GOTO 10620
  397. '
  398. ' *****  REMOVE INVALID CHARACTERS FROM USER NAME  ***
  399. '
  400. 455 CALL BADCHAR (ACTIVE.USER.NAME$)
  401.     IF ACTIVE.USER.NAME$ = "" THEN _
  402.        GOTO 400
  403. '
  404. ' ****  CHECK FOR ACTIVE USER   ***
  405. '
  406. 457 CALL SKIPLINE (1)
  407.     GOSUB 12840
  408.     GOSUB 12850
  409.     GOSUB 12598
  410.     GOSUB 11482
  411.     CALL COMPDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,TODAY.COMPUTE.DATE!)
  412.     IF NOT FOUND THEN _
  413.        GOTO 700
  414.     GOSUB 12984
  415. '
  416. ' *****  ACTIVE USER FOUND  ****
  417. '
  418. 459 GOSUB 9500
  419.     LAST.DATE.TIME.ON.SAVE$ = LAST.DATE.TIME.ON$
  420.     IF EXIT.TO.DOORS THEN _
  421.        TEMP.HOLD.TIME! = VAL(LEFT$(TIM$,2))*3600 + _
  422.                          VAL(MID$(TIM$,4,2))*60 : _
  423.        CALL FINDTIME (TEMP.LOGON.TIME!) : _                          ' KP061804
  424.        MINUTES.IN.DOORS = INT((TEMP.LOGON.TIME! - _                  ' KP061804
  425.                               (TEMP.LOGON.TIME! <= TEMP.HOLD.TIME!) * 86400 - _ ' KP061804
  426.                               TEMP.HOLD.TIME!) / 60) : _
  427.        CALL TIMEREMAIN (TIME.REMAINING!)
  428.     USER.FILE.INDEX = LOC(5)
  429.     GOSUB 5135
  430. '
  431. ' ***  COMPUTE THE NUMBER OF DAYS REMAINING UNTIL REGISTRATION EXPIRES **
  432. '
  433.     IF RESTRICT.BY.DATE THEN _
  434.        CALL COMPDATE (USER.REG.YY,USER.REG.MM,USER.REG.DD,USER.COMPUTE.DATE!) : _
  435.        REG.DAYS.REMAINING = USER.COMPUTE.DATE! + _
  436.                             DAYS.IN.REGISTRATION.PERIOD - _
  437.                             TODAY.COMPUTE.DATE! : _
  438.        CALL EXPDATE (USER.COMPUTE.DATE!,DAYS.IN.REGISTRATION.PERIOD,EXPIRATION.DATE$) _
  439.     ELSE REG.DAYS.REMAINING = 365
  440.     IF NOT PRIVATE.DOOR THEN _
  441.        IF REG.DAYS.REMAINING < 0 THEN _
  442.        IF USER.SECURITY.LEVEL > EXPIRED.SECURITY THEN _
  443.           CALL QTPUT1 (LG$(9) + _
  444.                       " - security reset to " + _
  445.                       STR$(EXPIRED.SECURITY)) : _
  446.           LOGON.ERROR.INDEX = 9 : _
  447.           USER.SECURITY.LEVEL = EXPIRED.SECURITY : _
  448.           LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  449.           GOSUB 5135
  450. 460 USER.SECURITY.LEVEL$ = STR$(USER.SECURITY.LEVEL)
  451.     IF USER.SECURITY.LEVEL > -1 THEN _
  452.        USER.SECURITY.LEVEL$ = MID$(USER.SECURITY.LEVEL$,2)
  453.     IF USER.SECURITY.LEVEL >= MINIMUM.LOGON.SECURITY THEN _
  454.        GOTO 470
  455.     IF NOT PRIVATE.DOOR THEN _
  456.        GOSUB 465 : _
  457.        CALL DELAYIT (8 + BPS)
  458.     IF LOGON.ERROR.INDEX < 9 AND _
  459.        EC = 0 THEN _
  460.        LOGON.ERROR.INDEX = 8
  461.     GOTO 10620
  462. '
  463. ' ***  DISPLAY LOG-ON MESSAGE FOR SPECIFIC SECURITY LEVEL  **
  464. '
  465. 465 TURBO.LOGON = TURBO.LOGON AND (EXIT.TO.DOORS OR _
  466.                   (USER.SECURITY.LEVEL >= ALLOW.CALLER.TURBO))
  467.     IF TURBO.LOGON THEN _
  468.        RETURN
  469.     FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  470.                  "LG" + _
  471.                  USER.SECURITY.LEVEL$ + _
  472.                  ".DEF"
  473.     CALL GRAPHIC (USER.GRAPHIC.DEFAULT$,FILE.NAME$)
  474. 466 STOP.INTERRUPTS = TRUE
  475.     BYPASS.TIME.CHECK = TRUE
  476.     CALL BUFFILE (FILE.NAME$,X)
  477.     RETURN
  478. 470 GOSUB 12989
  479.     CI$ = CITY.STATE$
  480.     CALL TRIM (CI$)
  481.     ATTEMPTS.ALLOWED = 4
  482.     PASSWORD.SAVE$ = PASSWORD$
  483.     TEMP.SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  484.     MESSAGE.PASSWORD = FALSE
  485.     IF NOT SUB.BOARD THEN _
  486.        ELAPSED.TIME = CVI(ELAPSED.TIME$)
  487.     IF EXIT.TO.DOORS THEN _                                          ' KP061804
  488.          DEDUCT.TIME = (TEMP.LOGON.TIME! - _                         ' KP061804
  489.            (MINUTES.IN.DOORS * 60) - USER.LOGON.TIME!) / 60 : _      ' KP061804
  490.          DEDUCT.TIME = DEDUCT.TIME - (1440 * (DEDUCT.TIME < 0)) : _  ' KP061804
  491.          ELAPSED.TIME = ELAPSED.TIME - DEDUCT.TIME _                 ' KP061804
  492.     ELSE IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON$,8) THEN _      ' KG061804
  493.             IF ELAPSED.TIME > 0 OR NOT KEEP.TIME.CREDITS THEN _
  494.                ELAPSED.TIME = 0
  495.     IF PRIVATE.DOOR AND _
  496.        TRANSFER.FUNCTION = 3 THEN _
  497.        GOSUB 755 : _
  498.        GOTO 800
  499.     IF PASSWORD.SAVE$ = SPACE$(LEN(PASSWORD.SAVE$)) THEN _
  500.        GOSUB 755 : _
  501.        GOTO 800
  502. 480 GOSUB 5370
  503.     IF PRIVATE.DOOR OR (A AND ESCAPE.INSECURE) OR DOOR.SKIPS.PASSWORD THEN _
  504.        Z$ = PASSWORD.SAVE$ : _
  505.        PASSWORD.FAILED = 0 : _
  506.        GOTO 644
  507.     IF Q => 3 THEN _
  508.        Z$ = B$(3) : _
  509.        ATTEMPTS = 1 : _
  510.        SUBROUTINE.PARAMETER = 5 _
  511.     ELSE SUBROUTINE.PARAMETER = 4
  512.     CALL PASSWRD
  513. 630 IF PASSWORD.FAILED THEN _
  514.        GOSUB 825 : _
  515.        LOGON.ERROR.INDEX = 4 : _
  516.        GOTO 10620
  517. 643 GOSUB 41070
  518. 644 NEW.USER = FALSE
  519.     WK$ = RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,2))),2) + _   ' MM
  520.            "/" + _
  521.            RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,3))),2) + _  ' DD
  522.            "/" + _
  523.            RIGHT$(STR$(ASC(LIST.NEW.DATE$)),2)              ' YY
  524.     LM$ = RIGHT$(WK$,2) + _                                 ' YY
  525.           LEFT$(WK$,2) + _                                  ' MM
  526.           MID$(WK$,4,2)                                     ' DD
  527.     IF MID$(LM$,3,1) = " " THEN _
  528.        MID$(LM$,3,1) = "0"
  529. 655 IF MID$(LM$,5,1) = " " THEN _
  530.        MID$(LM$,5,1) = "0"
  531. 660 CALL MUZAK (1)
  532.     GOTO 800
  533. 670 GOSUB 12570
  534.     IF FOUND THEN _
  535.        GOSUB 12984 : _
  536.        RETURN 12595
  537.     RETURN
  538. '
  539. ' ****  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)  ***
  540. '
  541. 700 EXPERT.USER = FALSE
  542.     CALL SETEXPERT
  543.     IF MIN.NEWCALLER.BAUD > BAUD.TEST THEN _
  544.        CALL QTPUT ("(" + MID$(STR$(BAUD.TEST),2) + " BAUD ACCESS FOR REGISTERED USERS ONLY)",2) : _
  545.        LG$(7) = "NEW CALLER BAUD RESTRICTION" : _
  546.        LOGON.ERROR.INDEX = 7 : _
  547.        GOTO 10620
  548.     CALL QTPUT1 ("User not found")                                   ' KG063001
  549.     GOSUB 12558
  550.     IF NO THEN _
  551.        GOSUB 12990 : _
  552.        GOTO 400
  553.     CALL LINE25
  554.     Z$ = FIRST.NAME$
  555.     GOSUB 670
  556.     Z$ = LAST.NAME$
  557.     GOSUB 670
  558.     Z$ = ACTIVE.USER.NAME$
  559.     GOSUB 670
  560.     TURBO.LOGON = FALSE
  561. 710 IF USER.FILE.INDEX = 0 AND NOT SURVIVE.NOUSER.ROOM THEN _
  562.        GOTO 13540
  563. 720 GOSUB 5370
  564.     IF A THEN _
  565.        USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL _
  566.     ELSE USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL
  567. 725 IF USER.SECURITY.LEVEL < MINIMUM.LOGON.SECURITY THEN _
  568.        LOGON.ERROR.INDEX = 1 : _
  569.        GOTO 460
  570.     IF FIRST.NAME$ = LAST.NAME$ THEN _
  571.        CALL QTPUT1 (FIRST.NAME.PROMPT$+"/"+LAST.NAME.PROMPT$+" cannot be same") : _
  572.        LOGON.ERROR.INDEX = 3 : _
  573.        GOTO 10620
  574.     IF NOT REMEMBER.NEW.USERS THEN _
  575.        GOSUB 13700 : _
  576.        USER.FILE.INDEX = 0 : _
  577.        GOSUB 12960: _
  578.        PREV.LAST.ON$ = "00-00-00": _
  579.        GOTO 735
  580.     NEW.USER = TRUE
  581.     CALL OPENUSER (HIGHEST.USER.RECORD)
  582.     GOSUB 9450
  583.     GOSUB 12630
  584.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = LEFT$("NEWUSER",LEN.HASH)
  585.     IF START.INDIV>0 THEN _
  586.        MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  587.     GOSUB 9440
  588. 730 GOSUB 12960
  589. 735 BYPASS.TIME.CHECK = TRUE
  590.     CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  591.     CALL LINE25
  592.     FILE.NAME$ = NEWUSER.FILE$
  593.     STOP.INTERRUPTS = TRUE
  594.     GOSUB 1790
  595.     CALL SKIPLINE(1)
  596. 739 CALL QTPUT1 (ACTIVE.USER.NAME$ + " from " + CI$)
  597. 740 A$ = "C)hange "+FIRST.NAME.PROMPT$+"/"+LAST.NAME.PROMPT$+"/"+USER.LOCATION$+", D)isconnect, [R]egister"  ' KG063001
  598.     GOSUB 12995
  599.     IF Q = 0 THEN _
  600.        Z$ = "R" _
  601.     ELSE CALL ALLCAPS (B$(1)) : _
  602.          Z$ = B$(1)
  603.     S = INSTR("CDR",Z$)
  604. 745 IF NOT REMEMBER.NEW.USERS THEN _
  605.        ON S GOTO 748,752,754
  606.     ON S GOTO 747,750,760
  607.     GOTO 740
  608. 747 CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  609.                            " changed Name/Address",2)
  610.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = STRING$(LEN.HASH,0)
  611.     GOSUB 9440
  612.     GOSUB 12991
  613. 748 FF = FALSE
  614.     GOTO 400
  615. '
  616. ' ***  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER) **
  617. '
  618. 750 CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  619.                            " didn't register",2)
  620.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = STRING$(LEN.HASH,0)
  621.     GOSUB 9440
  622.     GOSUB 12991
  623. 752 FF = FALSE
  624.     USER.FILE.INDEX = 0
  625.     GOTO 13540
  626. '
  627. ' *****  GET AND VERIFY PASSWORD   ****
  628. '
  629. 754 CALL QTPUT1 ("GUEST privileges granted.  RE-REGISTER on future calls")
  630.     USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  631.     GOTO 832
  632. 755 IF PRIVATE.DOOR THEN _
  633.        B$ = PASSWORD$ : _
  634.        Z$ = B$ : _
  635.        RETURN
  636.     GOSUB 12800
  637.     A$ = "Re-Enter PASSWORD for Verification (Dots Echo)"
  638.     GOSUB 45010
  639.     SWAP Z$,B$
  640.     CALL ALLCAPS (Z$)
  641.     IF B$ <> Z$ THEN _
  642.        CALL QTPUT1 ("Passwords Don't Match!") : _
  643.        GOTO 755
  644.     RETURN
  645. '
  646. ' ***  R - COMMAND FROM NEWUSER ROUTINE - REGISTER   **
  647. '
  648. 760 GOSUB 755
  649.     CALL ALLCAPS (Z$)
  650.     LSET PASSWORD$ = Z$
  651.     CALL QTPUT1 ("Please REMEMBER your password")
  652.     USER.TEXT.COLOR = 37
  653.     TEMP.SECURITY.LEVEL = USER.SECURITY.LEVEL
  654.     CALL PROTOCOL
  655.     USER.TRANSFER.DEFAULT$ = "N"
  656.     PROTO.PROMPT$ = "None"
  657.     IF NEWUSER.SETS.DEFAULTS THEN _
  658.        GOSUB 42950 : _
  659.        BYPASS.TIME.CHECK = TRUE : _
  660.        GOSUB 43000 : _
  661.        BYPASS.TIME.CHECK = FALSE : _
  662.        CALL GRAPHIC (USER.GRAPHIC.DEFAULT$,FILE.NAME$) : _
  663.        GOSUB 42805 : _
  664.        GOSUB 42700 _
  665.     ELSE UPPER.CASE = FALSE : _
  666.          HIGHLIGHT.OFF = TRUE : _
  667.          CALL SETUGD (0,USER.GRAPHIC.DEFAULT$) : _
  668.          NULLS = FALSE
  669.     GOSUB 12900
  670.     GOSUB 5135
  671.     CALL DEFAULTU
  672.     FILE.NAME$ = NEW.USER.QUESTIONNAIRE$
  673.     GOSUB 11520
  674.     LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  675.     USER.SECURITY.LEVEL$ = STR$(USER.SECURITY.LEVEL)
  676.     CALL REMOVE (USER.SECURITY.LEVEL$," ")
  677. '
  678. ' ****  LOGIN ALL USERS  ***
  679. '
  680. 800 CALL DOORRTN
  681.     IF ADJUSTED.SECURITY THEN _
  682.        GOSUB 5135
  683.     IF ORIG.CONFIG$ = CURRENT.DEF$ THEN _
  684.        MAIN.USER.FILE.INDEX = USER.FILE.INDEX : _
  685.        ORIG.SECURITY = USER.SECURITY.LEVEL : _
  686.        USER.SECURITY.SAVE = USER.SECURITY.LEVEL : _
  687.        ORIG.USER.NAME$ = ACTIVE.USER.NAME$
  688.     TIMES.LOGGED.ON = CVI(MID$(USER.OPTIONS$,1,2)) - _
  689.        ((ORIG.CONFIG$ <> CURRENT.DEF$ OR NOT SUB.BOARD) AND _
  690.         (NOT PRIVATE.DOOR) AND (NOT EXIT.TO.DOORS))
  691.     GOSUB 9500
  692.     IF (NOT EXIT.TO.DOORS) AND (NOT SUB.BOARD) THEN _
  693.        CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  694.                  " Lvl" + STR$(USER.SECURITY.LEVEL) + " " + TIME$,2)
  695.     PREV.LAST.ON$ = LAST.DATE.TIME.ON$
  696.     IF LOCAL.USER THEN _
  697.        TALK.TO.MODEM.AT$ = "9600" : _
  698.        BAUD.PARITY$ = "9600 BAUD,N,8,1" : _
  699.        MODEM.INIT.BAUD$ = "9600" : _
  700.        SNOOP = TRUE : _
  701.        LINE.FEEDS = TRUE
  702.     CALL SETCRLF
  703.     CALL CALLOPT
  704.     CALL XFERTYPE (2,TRUE)
  705.     IF NOT SUB.BOARD THEN _
  706.        BOARD.CHECK.DATE$ = PREV.LAST.ON$
  707.     IF PRIVATE.DOOR OR SUB.BOARD THEN _
  708.        GOTO 815
  709.     GOSUB 465
  710.     IF (EIGHT.BIT AND _
  711.        AUTODOWNLOAD.DESIRED) OR _
  712.        ASK.IDENTITY THEN _
  713.        CALL TESTUSER
  714.     CALL QTPUT1 ("Logging " + ACTIVE.USER.NAME$)
  715.     CALL TALK (1,A$)
  716.     CALL QTPUT1 ("RBBS-PC " + VERSION.ID$ + " NODE " + NODE.ID$ + _
  717.                 ", OPERATING AT " + BAUD.PARITY$)
  718.     CALL SKIPLINE (1)
  719.     ATTEMPTS = 0
  720. '
  721. ' *****  NOTIFY CALLER IF ABLE TO "AUTODOWN"  ****
  722. '
  723.     IF EIGHT.BIT AND AUTODOWNLOAD.AVAILABLE THEN _
  724.        A$ = CHR$(9) + _
  725.             RETURN.LINE.FEED$ + _
  726.             "You may use AUTODOWNLOADing!" : _
  727.        CALL RINGCALLER : _
  728.        CALL DELAYIT(4)
  729. 815 DOWNLOADS = CVI(USER.DOWNLOADS$)
  730.     UPLOADS = CVI(USER.UPLOADS$)
  731.     IF ENFORCE.UPLOAD.DOWNLOAD.RATIOS THEN _
  732.        DL.TODAY! = CVS(TODAY.DL$) : _
  733.        BYTES.TODAY! = CVS(TODAY.BYTES$) : _
  734.        DLBYTES! = CVS(DL.BYTES$) : _
  735.        ULBYTES! = CVS(UL.BYTES$)
  736.     IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON.SAVE$,8) THEN  _
  737.        DL.TODAY! = 0 : _
  738.        BYTES.TODAY! = 0
  739.     IF NOT GLOBALS.SET THEN _
  740.        GLOBALS.SET = TRUE : _
  741.        GLOBAL.DOWNLOADS = DOWNLOADS : _
  742.        GLOBAL.UPLOADS = UPLOADS : _
  743.        GLOBAL.DL.TODAY! = DL.TODAY! : _
  744.        GLOBAL.BYTES.TODAY! = BYTES.TODAY! : _
  745.        GLOBAL.DLBYTES! = DLBYTES! : _
  746.        GLOBAL.ULBYTES! = ULBYTES!
  747.     IF RATIO.RESTRICTION# > 0 AND ENFORCE.UPLOAD.DOWNLOAD.RATIOS THEN _
  748.        IF BYTE.METHOD = 0 AND UPLOADS < INITIAL.CREDIT# THEN _
  749.           UPLOADS = INITIAL.CREDIT# _
  750.        ELSE IF BYTE.METHOD = 1 AND ULBYTES! < INITIAL.CREDIT# THEN _
  751.                ULBYTES! = INITIAL.CREDIT#
  752.     GOSUB 827                                                        ' KG052101
  753.     LSET USER.OPTIONS$ = MKI$(TIMES.LOGGED.ON) + _
  754.                          MID$(USER.OPTIONS$,3)
  755.     LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  756.                               " " + _
  757.                               TIME.LOGGED.ON$
  758.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = HASH.VALUE$
  759.     IF START.INDIV > 0 THEN _
  760.        MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  761.     LSET USER.NAME$ = ORIG.USER.NAME$
  762.     IF (NOT EXIT.TO.DOORS) AND NOT (ORIG.MESSAGE.FILE$ = ACTIVE.MESSAGE.FILE$ AND SUB.BOARD) THEN _
  763.        CALL AUTOPAGE
  764.     IF NOT SUB.BOARD THEN _
  765.        ORIG.USER.FILE.INDEX = USER.FILE.INDEX
  766.     GOSUB 9440
  767.     GOSUB 12991
  768.     CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  769.     IF TURBO.LOGON THEN _
  770.        GOTO 819
  771.     IF NOT SAME.USER THEN _
  772.        STOP.INTERRUPTS = NOT WELCOME.INTERRUPTABLE : _
  773.        BYPASS.TIME.CHECK = TRUE : _
  774.        FILE.NAME$ = WELCOME.FILE$ : _
  775.        DISPLAY.AS.UNIT = TRUE : _
  776.        GOSUB 1790 : _
  777.        DISPLAY.AS.UNIT = FALSE
  778.     BYPASS.TIME.CHECK = FALSE
  779.     STOP.INTERRUPTS = TRUE
  780. 816 IF NOT NEW.USER THEN _
  781.        CALL QTPUT1 ("Times on:" + STR$(TIMES.LOGGED.ON) + _
  782.             "  Last was: " + PREV.LAST.ON$)
  783. 817 IF NOT REMIND.FILE.TRANSFERS OR NEW.USER THEN _
  784.        GOTO 818
  785.     A$ = "Files Downloaded:" + _
  786.          STR$(DOWNLOADS) + _
  787.          "  Uploaded:" + _
  788.          STR$(UPLOADS)
  789.     GOSUB 12977
  790.     CALL CHECKRATIO (FALSE)
  791. 818 CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  792.     IF REMIND.PROFILE THEN _
  793.        GOSUB 5400 : _
  794.        CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  795. 819 CALL TRIM (CI$)
  796.     GOSUB 5370
  797.     IF A THEN _
  798.        ACTIVE.USER.NAME$ = "SYSOP"
  799.     IF (NODE.RECORD.INDEX < 2) THEN _
  800.        GOTO 821
  801.     GOSUB 4910
  802.     GOSUB 24000
  803.     GET 1,NODE.RECORD.INDEX
  804.     MID$(MESSAGE.RECORD$,1,31) = ACTIVE.USER.NAME$ + _
  805.                                  SPACE$(31 - LEN(ACTIVE.USER.NAME$))
  806.     MID$(MESSAGE.RECORD$,40,2) = " 0"
  807.     MID$(MESSAGE.RECORD$,44,2) = STR$(BPS)
  808.     MID$(MESSAGE.RECORD$,55,2) = " 0"
  809.     MID$(MESSAGE.RECORD$,57,1) = "A"
  810.     MID$(MESSAGE.RECORD$,60,5) = TALK.TO.MODEM.AT$ + _
  811.                                  SPACE$(5 - LEN(TALK.TO.MODEM.AT$))
  812.     MID$(MESSAGE.RECORD$,72,2) = " 0"
  813.     MID$(MESSAGE.RECORD$,93,24) = CI$ + _
  814.                                   SPACE$(24)
  815.     PUT 1,NODE.RECORD.INDEX
  816.     GOSUB 12985
  817. 821 IF EXIT.TO.DOORS THEN _
  818.        IF TRANSFER.FUNCTION = 3 THEN _
  819.           NEW.USER = TRUE : _
  820.           TURBO.LOGON = FALSE : _
  821.           SAME.USER = FALSE : _
  822.           TRANSFER.FUNCTION = 0 : _
  823.           GOTO 832 _
  824.        ELSE GOTO 832
  825.     IF (SUB.BOARD AND (ORIG.MESSAGE.FILE$ = ACTIVE.MESSAGE.FILE$)) _
  826.        OR ((USER.SECURITY.LEVEL > MAX.REG.SEC) AND (NOT NEW.USER)) THEN _
  827.        GOTO 832
  828.     Z$ = REGISTRATION.PROGRAM$
  829.     TRANSFER.FUNCTION = 3
  830.     CALL DOOREXIT
  831.     TRANSFER.FUNCTION = 0                                            ' KG072101
  832.     GOTO 832
  833. '
  834. ' ****  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE   ***
  835. '
  836. 822 LOCATE 24,1
  837.     CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  838.     LOCAL.USER = TRUE
  839.     SNOOP = TRUE
  840.     SYSOP = TRUE
  841.     WAIT.BEFORE.DISCONNECT = 32400
  842.     BPS = -6
  843.     CALL COMMINFO
  844.     CALL MUZAK (2)
  845.     IF NOT ESCAPE.INSECURE THEN _
  846.        GOTO 345
  847.     ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  848.     FIRST.NAME$ = SYSOP.PASSWORD.1$
  849.     LAST.NAME$ = SYSOP.PASSWORD.2$
  850.     CALL FINDTIME (USER.LOGON.TIME!)
  851.     TIME.LOGGED.ON$ = TIME$
  852.     LINES.PRINTED = 0                                                ' KP062006
  853.     GOTO 457
  854. 825 X = (MAX.PER.DAY - MINUTES.PER.SESSION!)
  855.     X = -X * (X > 0)    ' extra from daily max
  856.     Q! = X + MINUTES.PER.SESSION! + (MAX.PER.DAY > 0) * ELAPSED.TIME
  857.     IF Q! > MINUTES.PER.SESSION! THEN _
  858.        Q! = MINUTES.PER.SESSION!
  859.     SECONDS.PER.SESSION! = Q! * 60 + TIME.CREDITS!                   ' KP061804
  860.     RETURN
  861. 827 IF LAST.MESSAGE.READ > HIGH.MESSAGE.NUMBER THEN _                ' KG052101
  862.        LAST.MESSAGE.READ = 0 : _                                     ' KG052101
  863.        MID$(USER.OPTIONS$,3,2) = MKI$(0)                             ' KG052101
  864.     RETURN                                                           ' KG052101
  865. 832 IF REG.DAYS.REMAINING <= DAYS.TO.WARN AND _
  866.        RESTRICT.BY.DATE AND REG.DAYS.REMAINING > 0 THEN _
  867.        CALL QTPUT1 ("Registration EXPIRES in" + _
  868.                    STR$(REG.DAYS.REMAINING) + " days!") : _
  869.        CALL DELAYIT (5)
  870.     IF (NOT REQ.QUES.ANSWERED) AND _
  871.        REQUIRED.QUESTIONNAIRE$ <> "" THEN _
  872.          FILE.NAME$ = REQUIRED.QUESTIONNAIRE$ : _
  873.          GOSUB 11520 : _
  874.          IF OK THEN _
  875.             REQ.QUES.ANSWERED = TRUE
  876. 837 Z$ = ACTIVE.USER.NAME$ + _
  877.             " on at " + _
  878.             CURRENT.DATE$ + _
  879.             ", " + _
  880.             TIM$ + _
  881.             " from " + _
  882.             CI$ + _
  883.             ", " + _
  884.             BAUD.PARITY$
  885.      NG$ = Z$ + SPACE$(128 - LEN(Z$))
  886.      MESSAGE.USER.NAME$ = LEFT$(ACTIVE.USER.NAME$,22)
  887. '
  888. ' *  ALWAYS RECORD THE HASH/INDIVIDUATING FIELD TO EACH RECORD LOGGED OUT
  889. '
  890.      X$ = "{" + _
  891.           HASH.VALUE$ + _
  892.           "/" + _
  893.           INDIV.VALUE$ + _
  894.           "}"
  895.      IF LEN(Z$) < 65 THEN _
  896.         X = 65 _
  897.      ELSE X = LEN(Z$) + 2
  898.      MID$(NG$,X) = X$
  899.      CALL PRINTIT ("  " + Z$)
  900.      IF NEW.USER THEN _
  901.         CALL UPDTCALR ("NEWUSER",1) : _
  902.         CALL MUZAK (2)
  903. 842 GOSUB 825
  904.     SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  905.     GOSUB 12987
  906.     IF SUB.BOARD THEN _
  907.        GOTO 850
  908.     GOSUB 12986
  909.     GOSUB 23000
  910.     CALLS.TODATE! = CALLS.TODATE! + 1 + (SYSOP OR HAS.DOORED)
  911.     GOSUB 24000
  912.     GOSUB 12985
  913. 850 SUBROUTINE.PARAMETER = 2
  914.     CALL LINE25
  915.     CALL SKIPLINE (1)
  916.     IF TURBO.LOGON THEN _
  917.        BULLETIN.SAVE$ = BULLETIN.MENU$ : _
  918.        GOTO 900
  919.     CALL CTNEWFILES (BOARD.CHECK.DATE$,M(),LAST.NEW,A$)
  920.     IF FMS.DIRECTORY$ <> "" THEN _
  921.        CALL QTPUT1 (A$ + STR$(LAST.NEW) + " NEW file(s) since last on") _
  922.     ELSE GOTO 852
  923.     IF NEW.USER OR LAST.NEW < 1 OR NOT NEW.FILES.CHECK THEN _
  924.        GOTO 852
  925.     L = LEN(DOWNLOAD.DRIVES$)
  926.     OSS = 19
  927.     IF (NOT SKIP.FILES.LOGON) AND _
  928.        (USER.SECURITY.LEVEL >= MIN.SEC.TO.VIEW) AND _
  929.        USER.SECURITY.LEVEL >= OPT.SEC(OSS) THEN _
  930.           A$ = "Review new files to download ([Y],N)" : _
  931.           GOSUB 12999 : _
  932.           IF NOT NO THEN _
  933.              Q = 3 : _
  934.              B$(2) = MID$(BOARD.CHECK.DATE$,1,2) + _
  935.                      MID$(BOARD.CHECK.DATE$,4,2) + _
  936.                      MID$(BOARD.CHECK.DATE$,7,2) : _
  937.              Y$ = B$(3) : _
  938.              CALL BRKFNAME (FMS.DIRECTORY$,DR$,Y$,X$,FALSE) : _
  939.              B$(3) = Y$ : _
  940.              TIME.LOCK.EXEMPT = TRUE : _
  941.              GOSUB 20185 : _
  942.              TIME.LOCK.EXEMPT = FALSE
  943. 852 STOP.INTERRUPTS = FALSE
  944.     SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  945.     IF USER.SECURITY.LEVEL < OPT.SEC (2) OR _
  946.        ACTIVE.BULLETINS < 1 OR _
  947.        SYSOP OR _
  948.        SAME.USER THEN _
  949.           GOTO 900
  950.     IF BULLETIN.MENU$ = BULLETIN.SAVE$ THEN _
  951.        GOTO 900
  952.     BULLETIN.SAVE$ = BULLETIN.MENU$
  953. 855 CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  954.     IF BULLETINS.OPTIONAL AND NOT NEW.USER THEN _
  955.        GOTO 856
  956.     STOP.INTERRUPTS = TRUE
  957.     NEW.USER = FALSE
  958.     GOSUB 9700
  959.     STOP.INTERRUPTS = FALSE
  960.     GOTO 900
  961. 856 IF NOT CHECK.BULLETIN.LOGON THEN _
  962.        ANS.INDEX = 0 : _
  963.        GOSUB 9760 : _
  964.        GOTO 900
  965.     CALL SKIPLINE (1)
  966.     A$ = "Skip the" + _
  967.          STR$(ACTIVE.BULLETINS) + _
  968.          " bulletins (Y,[N])"
  969.     GOSUB 12999
  970.     IF YES THEN _
  971.        GOTO 900
  972. 860 NEW.USER = FALSE
  973.     GOSUB 9700
  974. 900 NEW.USER = FALSE
  975.     ACTION.FLAG = (LOGON.MAIL.LEVEL$ = "S")
  976.     LOGON.MAIL.NEW = (LOGON.MAIL.LEVEL$ = "N")
  977.     GOSUB 1895
  978.     IF ACTIVE.USER.NAME$ = "SYSOP" AND NOT SYSOP THEN _
  979.        ACTIVE.USER.NAME$ = ORIG.USER.NAME$
  980.     LOGON.MAIL.NEW = FALSE
  981.     SUBROUTINE.PARAMETER = 2
  982.     CALL LINE25
  983.     SECTION$ = "    "
  984.     A$ = ""
  985.     IF (NOT CONFERENCE.MODE) AND (NOT SUB.BOARD) AND NOT TURBO.LOGON THEN _
  986.        MAILCHECK.CONFIRM = TRUE : _
  987.        NON.STOP = TRUE : _
  988.        GOSUB 5800
  989.     MAILCHECK.CONFIRM = FALSE
  990.     Q! = MINUTES.IN.DOORS * 60
  991.     EXIT.TO.DOORS = FALSE
  992.     GOSUB 2350
  993.     IF NOT PRIVATE.DOOR THEN _
  994.        GOTO 955
  995.     GOSUB 20165
  996.     CALL SETSECT
  997.     PRIVATE.DOOR = FALSE
  998.     GOTO 1205
  999. 955 IF NOT TURBO.LOGON THEN _
  1000.        GOSUB 4850
  1001.     TURBO.LOGON = FALSE
  1002. '
  1003. ' *                           COMMAND PROCESSING
  1004. '
  1005. 1200 CLOSE 1
  1006.      GOSUB 1280
  1007. 1205 IF SUBROUTINE.PARAMETER < 0 THEN _                              ' KG072502
  1008.         GOTO 202                                                     ' KG052005
  1009.      SUBROUTINE.PARAMETER = 1
  1010.      STOP.INTERRUPTS = FALSE
  1011.      NON.STOP = (PAGE.LENGTH < 1)                                    ' KG072603
  1012.      Q = 0
  1013.      IF HOME.CONFERENCE$ <> "" AND HOME.CONFERENCE$ <> "MAIN" THEN _
  1014.         TURBO.LOGON = (NOT CONFMAIL.JOIN) : _
  1015.         CONFMAIL.JOIN = FALSE : _
  1016.         FF = 8 : _
  1017.         B$(2) = HOME.CONFERENCE$ : _
  1018.         HOME.CONFERENCE$ = "" : _
  1019.         Q = 2 : _
  1020.         GOTO 1240
  1021.      CALL SKIPLINE (1)
  1022. 1210 GOSUB 41000
  1023.      CALL TALK (10,A$)
  1024.      CALL DISPLAYTR (TIME.REMAINING!)
  1025.      IF EXPERT.USER THEN _
  1026.         GOTO 1230
  1027. 1212 LINES.PRINTED = -MENUS.CAN.PAUSE * LINES.PRINTED
  1028.      IF CUSTOM.PUI THEN _
  1029.         GOTO 1230
  1030.      IF SUB.SECTION < BEG.FILE THEN _
  1031.         IF USER.SECURITY.LEVEL >= SYSOP.MENU.SECURITY.LEVEL THEN _
  1032.            FILE.NAME$ = MENU$(1) : _
  1033.            GOSUB 43025
  1034.      FILE.NAME$ = MENU$(MENU.INDEX)
  1035.      DELETE.INVALID = TRUE
  1036.      GOSUB 43025
  1037.      DELETE.INVALID = FALSE
  1038. 1230 CALL LINE25
  1039.      CALL SKIPLINE (1)
  1040.      IF CONFERENCE.MODE THEN _
  1041.         A$ = GRN$ : _
  1042.         GOSUB 12979 : _
  1043.         CALL TALK (65,GRN$)
  1044.      IF CUSTOM.PUI THEN _
  1045.         CALL USERFACE (USER.GRAPHIC.DEFAULT$) : _
  1046.         GOSUB 12997 : _
  1047.         GOTO 1235
  1048.      IF MENU.INDEX = 6 THEN _
  1049.         SUBROUTINE.PARAMETER = 1 : _
  1050.         CALL LIBRARY
  1051.      CALL TALK (MENU.INDEX, A$)
  1052.      POSSIBLE.MACRO = TRUE
  1053.      A$ = COMMAND.PROMPT$
  1054.      GOSUB 12999
  1055.      IF Q = 0 THEN _
  1056.         GOTO 1230
  1057. 1235 Z$ = B$(1)
  1058.      IF LEN(Z$) < 1 THEN _
  1059.         GOTO 1230
  1060.      CALL SRCHCMND (SUB.SECTION,FF)
  1061.      IF FF < 1 THEN _
  1062.         CALL QTPUT1 ("Unknown command <"+Z$+">") : _
  1063.         GOTO 1230
  1064.      CALL TALK (65,"OPTION "+Z$+" SELECTED")
  1065. 1240 IF USER.SECURITY.LEVEL < OPT.SEC(FF) THEN _
  1066.         VIOLATION$ = SECTION$ + _
  1067.                      " " + _
  1068.                      Z$ : _
  1069.         GOSUB 1380 : _
  1070.         GOTO 1205
  1071.      IF FF > 39 THEN _
  1072.         DIRECTORY.EXTENTION$ = LIBRARY.DIRECTORY.EXTENTION$ _
  1073.      ELSE DIRECTORY.EXTENTION$ = MAIN.DIRECTORY.EXTENTION$
  1074.      LAST.INDEX = Q
  1075.      ANS.INDEX = 1 - (LAST.INDEX > 1)
  1076.         ON FF GOSUB _
  1077.                  1400, _      ' 1  A)nswer questionnaire 1
  1078.                  9700, _      ' 2  B)ulletins
  1079.                  1800, _      ' 3  C)omments
  1080.                  10970, _     ' 4  D)oor (exit to)
  1081.                  2000, _      ' 5  E)nter a message
  1082.                  1275, _      ' 6  F)ile system (exit to)
  1083.                  1760, _      ' 7  I)nitial welcome redisplayed
  1084.                  5300, _      ' 8  J)oin a conference
  1085.                  3900, _      ' 9  K)ill a message
  1086.                  4700, _      '10  O)perator page
  1087.                  1900, _      '11  P)ersonal mail (look for)
  1088.                  4330, _      '12  R)ead messages
  1089.                  4340, _      '13  S)can message headers
  1090.                  4320, _      '14  T)opic msg scan
  1091.                  1285, _      '15  U)tilities (exit to)
  1092.                  5800, _      '16  V)iew a conference
  1093.                  9800, _      '17  W)ho's on other nodes displayed
  1094.                  1283, _      '18  @)Library (exit to) 18
  1095.                 20160, _      '19  D)ownload
  1096.                 10570, _      '20  G)oodbye
  1097.                 20155, _      '21  L)ist
  1098.                 20185, _      '22  N)ew
  1099.                 20180, _      '23  P)ersonal files
  1100.                 20175, _      '24  S)can
  1101.                 20170, _      '25  U)pload
  1102.                 20140, _      '26  V)iew ARC Contents
  1103.                  5500, _      '27  B)aud rate change 300==>450 1
  1104.                  9100, _      '28  C)lock (time & time on)
  1105.                  42850, _     '29  E)cho selection
  1106.                  42800, _     '30  F)ile transfer protocol
  1107.                  43000, _     '31  G)raphics
  1108.                  5200, _      '32  L)ines per page
  1109.                  10925, _     '33  M)essage margin
  1110.                  5110, _      '34  P)assword change
  1111.                  5400, _      '35  R)eview preferences
  1112.                  4850, _      '36  S)tatistics displayed
  1113.                  1500, _      '37  T)oggle
  1114.                  10090, _     '38  U)serlog displayed 12
  1115.                  30000, _     '39  A)rchive a Library disk 1
  1116.                  30100, _     '40  C)hange a Library disk
  1117.                  30200, _     '41  D)ownload Library files
  1118.                  10570, _     '42  G)oodbye
  1119.                  20155, _     '43  L)ist a Library directory
  1120.                  20175, _     '44  S)can a Library disk directory
  1121.                  20140, _     '45  V)iew arc contents 7
  1122.                  1325, _      '45  H)elp 1
  1123.                  1330, _      '46  ?)help
  1124.                  1250, _      '49  Q)uit
  1125.                  4240, _      '50  X)expert toggle on/off 4
  1126.                  10070, _     '51  1) List comments file 1
  1127.                  10090, _     '52  2) List callers file
  1128.                  10390, _     '53  3) Recover a message
  1129.                  10530, _     '54  4) Erase comments
  1130.                  11000, _     '55  5) User file maintenance
  1131.                   4130, _     '56  6) Toggle page bell on/off
  1132.                  10930        '57  7) Exit to DOS 2.x or above 7
  1133.      GOTO 1205
  1134. '
  1135. ' ****           QUIT COMMAND (GLOBAL)              ***
  1136. '
  1137. 1250 IF Q > 1 THEN _
  1138.         ANS.INDEX = 2: _
  1139.         GOTO 1270
  1140. 1260 ANS.INDEX = 1
  1141.      IF EXPERT.USER THEN _
  1142.         A$ = QUIT.PROMPT.EXPERT$ _
  1143.      ELSE A$ = QUIT.PROMPT.NOVICE$
  1144.      GOSUB 12999
  1145.      IF Q = 0 THEN _
  1146.         Q = 1: _
  1147.         B$(1) = "M"
  1148. 1270 Z$ = B$(ANS.INDEX)
  1149.      CALL ALLCAPS (Z$)
  1150.      IF Z$ = "C" THEN _
  1151.         Z$ = "M" : _
  1152.         GOTO 5323
  1153.      IF Z$ <> SPACE$(LEN(Z$)) THEN _
  1154.         ON INSTR(QUIT.LIST$,Z$) GOTO 1275,1280,1285,10570,1283
  1155.      GOTO 1260
  1156. 1275 MENU.INDEX = 3
  1157.      GOTO 1295
  1158. 1280 MENU.INDEX = 2
  1159.      GOTO 1295
  1160. 1283 MENU.INDEX = 6
  1161.      ACTIVE.FMS.DIRECTORY$ = ""
  1162.      GOTO 1295
  1163. 1285 MENU.INDEX = 4
  1164. 1295 CALL SETSECT
  1165.      RETURN
  1166. 1300 CALL QTPUT1 ("Message base " + GRN$)
  1167.      RETURN
  1168. '
  1169. ' **** COMMON LOCAL DISPLAY PRINT  ***
  1170. '
  1171. 1315 NUM.RETURNS = 1
  1172. 1320 CALL LPRNT(D$,NUM.RETURNS)
  1173.      RETURN
  1174. '
  1175. ' ******            HELP (GLOBAL)           ****
  1176. '
  1177. 1325 CALL VIEWHELP (SUB.SECTION,USER.GRAPHIC.DEFAULT$, _
  1178.                 MID$("MAINFILEUTILMAINLIBR",4 * MENU.INDEX - 7,4))
  1179.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1180.         RETURN 10595
  1181.      RETURN
  1182. 1330 IF EXPERT.USER THEN _
  1183.         RETURN 1212
  1184.      GOTO 1325
  1185. '
  1186. ' *****  RECORD SECURITY VIOLATIONS   ****
  1187. '
  1188. 1380 CALL SVIOLATION
  1189.      IF NOT DENY.ACCESS THEN _
  1190.         RETURN
  1191. 1386 CALL DENYACCESS
  1192.      GOTO 10620
  1193. 1397 A$ = "Sorry, " + _
  1194.           FIRST.NAME$ + _
  1195.           ", " + _
  1196.           A$
  1197.      GOTO 12975
  1198. '
  1199. ' ***  END KEY - FORCE CURRENT USER OFF AND LOCK THEM OUT  **
  1200. '
  1201. 1400 A1$ = ANS.MENU$
  1202.      CALL TALK (13,A$)
  1203.      RETURN.TO.PROMPT = (Q > 1)
  1204. 1401 CALL SUBMENU ("Which questionnaire(s), L)ist" + PRESS.ENTER.EXPERT$, _
  1205.         A1$,QUES.PATH$,".DEF","",USER.GRAPHIC.DEFAULT$,TRUE,FALSE,TRUE,"")
  1206.      IF Q = 0 THEN _
  1207.         RETURN
  1208.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1209.         RETURN 10595
  1210.      QUESTIONNAIRE.HOLD$ = Z$
  1211.      GOSUB 11520
  1212.      CLOSE 2
  1213.      CALL UPDTCALR (QUESTIONNAIRE.HOLD$ + " questionnaire " + _
  1214.         MID$("answeredaborted",1 - 8 * QUESTIONNAIRE.ABORTED,8),2)
  1215.      ANS.INDEX = ANS.INDEX + 1
  1216.      IF ANS.INDEX > LAST.INDEX THEN _
  1217.         ANS.INDEX = 0
  1218.      IF RETURN.TO.PROMPT THEN _
  1219.         RETURN _
  1220.      ELSE GOTO 1401
  1221. '
  1222. ' *****    TOGGLE COMMAND (UTILITIES)     ****
  1223. '
  1224. 1500 IF Q > 1 THEN _
  1225.         ANS.INDEX = 2 : _
  1226.         LAST.INDEX = Q : _
  1227.         GOTO 1510
  1228. 1502 ANS.INDEX = 1
  1229.      A$ = "A)utodwnld   B)ullet  C)ase     F)ile   H)ilite"
  1230.      CALL COLORPMT (A$)
  1231.      CALL QTPUT1 (A$)
  1232.      A$ = "L)ine feeds  N)ulls   T)urboKey X)pert  !)bell"
  1233.      CALL COLORPMT (A$)
  1234.      CALL QTPUT1 (A$)
  1235.      A$ = "TOGGLE which options on/off?" + PRESS.ENTER$
  1236.      GOSUB 12999
  1237.      IF Q=0 THEN _
  1238.         RETURN
  1239.      LAST.INDEX = Q
  1240. 1510 Z$ = B$(ANS.INDEX)
  1241.      CALL ALLCAPS (Z$)
  1242.      FF = INSTR("ABCFHLNTX!",Z$)
  1243.      IF FF < 1 THEN _
  1244.         GOTO 1502
  1245.      CALL TOGGLE (FF)
  1246.      IF SUBROUTINE.PARAMETER < 0 THEN _
  1247.         GOTO 202
  1248.      ANS.INDEX = ANS.INDEX + 1
  1249.      IF ANS.INDEX > LAST.INDEX THEN _
  1250.         GOTO 1502
  1251.       GOTO 1510
  1252. '
  1253. ' ****  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)  ***
  1254. '
  1255. 1760 FILE.NAME$ = PRELOG$
  1256.      GOSUB 1790
  1257.      FILE.NAME$ = WELCOME.FILE$
  1258.      GOSUB 1790
  1259.      RETURN
  1260. 1790 CALL GRAPHIC (USER.GRAPHIC.DEFAULT$,FILE.NAME$)
  1261.      CALL BUFFILE (FILE.NAME$,X)
  1262.      CALL CARRIER
  1263.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1264.         RETURN 10595
  1265.      RETURN
  1266. '
  1267. ' ***  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)   **
  1268. '
  1269. 1800 MESSAGE.TO$ = "SYSOP"
  1270.      ORIG.SUBJECT$ = "COMMENT"
  1271.      GOSUB 1893
  1272.      IF (ACTIVE.MESSAGES >= MAXIMUM.MESSAGES OR _
  1273.         ((NOT MESSAGES.CAN.GROW) AND _                               ' KG053001
  1274.         (NEXT.MESSAGE.RECORD + 5 > HIGHEST.MESSAGE.RECORD)) OR _     ' KG053001
  1275.         NOT COMMENTS.AS.MESSAGES ) THEN _
  1276.         A$ = "Want a REPLY?  Use "+MID$(ALL.OPTS$,5,1)+" instead.  Leave a comment? (Y/[N])" : _
  1277.         GOSUB 12999 : _
  1278.         IF NOT YES THEN _
  1279.            CALL SKIPLINE (1) : _
  1280.            RETURN _
  1281.         ELSE SYSOP.COMMENT = TRUE : _
  1282.              GOTO 2007
  1283.      SYSOP.COMMENT = FALSE
  1284.      SYSOP.MESSAGE = TRUE
  1285.      MSG.HEADER$ = "comment"                                         ' KG072003
  1286.      GOTO 2010
  1287. 1850 BX = &H3
  1288.      EN$ = COMMENTS.FILE$
  1289.      GOSUB 12992
  1290.      CALL OPENWRKA (COMMENTS.FILE$)
  1291.      A$ = FIRST.NAME$ + _
  1292.           ", Thanks for comments!"
  1293.      GOSUB 12976                                                     ' KG061203
  1294.      CALL AMORPM
  1295.      CALL PRNTWRKA (ACTIVE.USER.NAME$+" "+CURRENT.DATE$+" "+TIM$+" Node "+NODE.ID$)
  1296.      FOR X = 1 TO LINES.IN.MESSAGE
  1297.         CALL PRNTWRKA (A$(X))
  1298.      NEXT
  1299.      CALL PRNTWRKA (CARRIAGE.RETURN$)
  1300.      CLOSE 2
  1301.      IF EC <> 0 THEN _
  1302.         EL = 1850 : _
  1303.         GOTO 13000
  1304.      BX = &H3
  1305.      EN$ = COMMENTS.FILE$
  1306.      GOSUB 12993
  1307.      CALL UPDTCALR ("Left comment",1)
  1308.      REDIM A$(ADIM)
  1309.      RETURN
  1310. '
  1311. ' ****  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)  ****
  1312. '
  1313. 1893 ACTION.FLAG = TRUE
  1314.      GOTO 1897
  1315. 1895 IF TURBO.LOGON THEN _]
  1316.         RETURN
  1317.      B$(0) = LEFT$("NEW ",-4*LOGON.MAIL.NEW)
  1318. 1897 IF ACTIVE.MESSAGE.FILE$ = PREV.BASE$ THEN _
  1319.         ACTION.FLAG = FALSE : _
  1320.         RETURN
  1321. 1900 GOSUB 5344
  1322.      IF PRIVATE.DOOR THEN _
  1323.         ACTION.FLAG = TRUE
  1324.      PREV.BASE$ = ACTIVE.MESSAGE.FILE$
  1325.      SHOW.ACTIVE = FALSE
  1326.      IF NOT ACTION.FLAG THEN _
  1327.         CALL QTPUT ("Checking messages in " + GRN.NAME$,0) : _
  1328.         SHOW.ACTIVE = TRUE _
  1329.      ELSE CALL QTPUT ("Loading messages",0) : _
  1330.           FOR I = 1 TO Q: _
  1331.              A$(I) = B$(I) : _
  1332.           NEXT
  1333.      I = 0
  1334.      MESSAGES.FROM.USER = FALSE
  1335.      ACTIVE.MESSAGES = 0
  1336.      MAIL.REPORTED = ACTION.FLAG
  1337.      FIRST.OLD = TRUE
  1338.      GOSUB 23000
  1339.      MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  1340.      ACTIVE.DELAY! = 0
  1341.      MAXIMUM.MESSAGES = VAL(MID$(MESSAGE.RECORD$,89,7))
  1342.      IF MAXIMUM.MESSAGES > MM THEN _
  1343.         MAXIMUM.MESSAGES = MM
  1344.      REDIM M(MAXIMUM.MESSAGES,2)
  1345.      NUM.DOTS = 0
  1346. 1905 GET 1,MESSAGE.RECORD
  1347.      CALL CHECKINT (MID$(MESSAGE.RECORD$,117,4))
  1348.      IF EC <> 0 THEN _
  1349.         EL = 1905 : _
  1350.         GOTO 13000
  1351.      NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,117,4))
  1352.      IF NUMBER.RECORDS.IN.MESSAGE < 1 THEN _
  1353.         NUMBER.RECORDS.IN.MESSAGE = 1
  1354. 1906 IF ACTION.FLAG OR (FIRST.OLD AND NOT MAIL.REPORTED) THEN _
  1355.         CALL MARKTIME (NUM.DOTS)
  1356.      CALL CARRIER
  1357.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1358.         RETURN 10595
  1359. 1910 IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _
  1360.         LOW.MESSAGE.NUMBER = M(1,2) : _
  1361.         GOTO 1950
  1362. 1915 IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ OR _
  1363.         MID$(MESSAGE.RECORD$,116,1) <> ACTIVE.MESSAGE$ THEN _
  1364.         GOTO 1946
  1365.      X$ = MID$(MESSAGE.RECORD$,121,2)
  1366.      IF X$ <> "  " THEN _
  1367.         IF CVI(X$) > USER.SECURITY.LEVEL THEN _
  1368.            GOTO 1945
  1369.      IF ACTION.FLAG THEN _
  1370.         GOTO 1935
  1371. '
  1372. ' ** ALLOW USERS WITH NAMES LONGER THAN 22 CHARS TO RECEIVE PRIVATE MAIL *
  1373. '
  1374. 1920 X$ = MID$(MESSAGE.RECORD$,37,22)
  1375.      IF INSTR(X$,MESSAGE.USER.NAME$) OR _
  1376.         (SYSOP AND INSTR(X$,"SYSOP")) OR _
  1377.         (SYSOP AND INSTR(X$,SYSOP.FULL.NAME$)) THEN _
  1378.         GOTO 1925
  1379.      GOTO 1935
  1380. 1925 A = VAL(MID$(MESSAGE.RECORD$,2,4))
  1381.      IF LOGON.MAIL.NEW THEN _
  1382.         IF A <= LAST.MESSAGE.READ THEN _
  1383.            GOTO 1935
  1384.      IF NOT SHOW.ACTIVE THEN _
  1385.         GOTO 1930
  1386.      MAIL.REPORTED = TRUE
  1387.      FIRST.NEW = (A > LAST.MESSAGE.READ)
  1388.      IF FIRST.NEW THEN _
  1389.         I = 0 : _
  1390.         CALL SKIPLINE (1) : _
  1391.         CALL QTPUT1 ("NEW Mail for YOU (* = Private)") _
  1392.      ELSE IF FIRST.OLD THEN _
  1393.              CALL SKIPLINE (1) : _
  1394.              CALL QTPUT1 ("OLD Mail for YOU (* = Private)") : _
  1395.              FIRST.OLD = FALSE
  1396.      SHOW.ACTIVE = NOT FIRST.NEW
  1397. 1930 CALL QTPUT (LEFT$(MESSAGE.RECORD$,5),0)
  1398.      I = I + 1
  1399.      IF I MOD 15 = 0 THEN _
  1400.         CALL SKIPLINE (1)
  1401. 1935 X$ = MID$(MESSAGE.RECORD$,6,31)
  1402.      IF INSTR(X$,ACTIVE.USER.NAME$) OR _
  1403.         (SYSOP AND INSTR(X$,"SYSOP")) OR _
  1404.         (SYSOP AND INSTR(X$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  1405.         GOTO 1940
  1406.      GOTO 1945
  1407. 1940 IF MESSAGES.FROM.USER < ADIM THEN _
  1408.         MESSAGES.FROM.USER = MESSAGES.FROM.USER + 1 : _
  1409.         B$(MESSAGES.FROM.USER) = LEFT$(MESSAGE.RECORD$,5)
  1410. 1945 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1411.      M(ACTIVE.MESSAGES,1) = MESSAGE.RECORD
  1412.      M(ACTIVE.MESSAGES,2) = VAL(MID$(MESSAGE.RECORD$,2,4))
  1413. 1946 MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE
  1414.      GOTO 1905
  1415. 1950 IF NOT MAIL.REPORTED THEN _
  1416.         A$ = "Sorry, " + _
  1417.              FIRST.NAME$ + _
  1418.              ", NO " + B$(0) + "MAIL for you" : _
  1419.         GOSUB 12975
  1420.      IF MESSAGES.FROM.USER = 0 OR NOT MESSAGE.REMINDER THEN _
  1421.         GOTO 1961
  1422.      IF ACTION.FLAG THEN _
  1423.         GOTO 1961
  1424.      A$ = "Mail you left"
  1425.      GOSUB 12976
  1426. 1960 FOR I = 1 TO MESSAGES.FROM.USER
  1427.         A$ = B$(I)
  1428.         GOSUB 12978
  1429.         IF I MOD 15 = 0 THEN _
  1430.            CALL SKIPLINE (1)
  1431.      NEXT
  1432.      CALL SKIPLINE (1)
  1433.      CALL QTPUT1 ("Please K)ill old/unneeded msgs")
  1434. 1961 REDIM B$(ADIM)
  1435.      IF ACTION.FLAG THEN _
  1436.         ACTION.FLAG = FALSE : _
  1437.         FOR I = 1 TO Q : _
  1438.             B$(I) = A$(I) : _
  1439.             A$(I) = "" : _
  1440.         NEXT
  1441.      CALL SKIPLINE (1)
  1442.      RETURN
  1443. '
  1444. ' ****  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)  ***
  1445. '
  1446. 2000 QUOTED.REPLY = FALSE
  1447. 2001 IF (LOW.MESSAGE.NUMBER > 0 AND ACTIVE.MESSAGES = MAXIMUM.MESSAGES) _ ' KB060901
  1448.         OR HIGH.MESSAGE.NUMBER >= 9999 THEN _                        ' BK060901
  1449.         IF ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ AND _
  1450.            ACTIVE.MESSAGES = 1 THEN _
  1451.            GOTO 5300 _
  1452.         ELSE A$ = "No more messages allowed!  Try tomorrow" : _
  1453.              GOSUB 12975 : _
  1454.              GOTO 3650
  1455. 2006 MESSAGE.PASSWORD$ = ""
  1456.      SYSOP.COMMENT = FALSE
  1457.      IF NOT REPLY THEN _
  1458.         MESSAGE.TO$ = ""
  1459. 2007 IF SYSOP.COMMENT THEN _
  1460.         Z$ = COMMENTS.FILE$ : _
  1461.         MSG.HEADER$ = "comment" _                                    ' KG072003
  1462.      ELSE Z$ = ACTIVE.MESSAGE.FILE$ : _
  1463.           MSG.HEADER$ = "message"                                    ' KG072003
  1464. 2008 IF SYSOP.COMMENT OR MESSAGES.CAN.GROW THEN _
  1465.         Y$ = "on disk" : _
  1466.         CALL FINDFREE : _
  1467.         GOTO 2009
  1468.      IF NEXT.MESSAGE.RECORD + 3 < HIGHEST.MESSAGE.RECORD THEN _
  1469.         GOTO 2010
  1470.      Y$ = "in file"
  1471.      FREE.SPACE$ = "1"
  1472. 2009 IF VAL(FREE.SPACE$) >= 2000 THEN _
  1473.         GOTO 2010
  1474.      A$ = "No room " + Y$ + " for " + MSG.HEADER$                    ' KG072003
  1475.      GOSUB 12979
  1476.      GOTO 3650
  1477. 2010 IF NOT QUOTED.REPLY THEN _
  1478.         LINES.IN.MESSAGE = 0 : _
  1479.         COMMPORT.STACK$ = "" : _
  1480.         L = 0 : _
  1481.         X = 0 : _
  1482.         REDIM A$(ADIM)
  1483.      IF GET.EXT.DESC THEN _
  1484.         GOTO 2100
  1485.      GOSUB 1893
  1486.      RECEIVER.RECORD.NUM = 0
  1487. 2020 CALL MSGTO (HIGHEST.USER.RECORD,MESSAGE.TO$,RECEIVER.RECORD.NUM,FOUND)
  1488.      IF SYSOP.COMMENT THEN _
  1489.         GOTO 2100
  1490.      IF SYSOP.MESSAGE THEN _
  1491.         SYSOP.MESSAGE = FALSE : _
  1492.         MESSAGE.PASSWORD$ = "^READ^" : _
  1493.         GOTO 2100
  1494.      IF MESSAGE.TO$ = "" THEN _
  1495.         RETURN
  1496.      IF REPLY THEN _
  1497.         FOUND = TRUE : _
  1498.         CALL TRIM (MESSAGE.TO$):  _
  1499.         GOTO 2035 _
  1500.      ELSE SUBJECT$ = ""
  1501.      GOSUB 2065
  1502. 2035 CALL MSGPROT (MESSAGE.TO$,FOUND,MESSAGE.PASSWORD$)
  1503.      IF MESSAGE.PASSWORD$ = "" THEN _
  1504.         GOTO 2020
  1505.      IF QUOTED.REPLY THEN _
  1506.         RETURN
  1507.      GOTO 2100
  1508. '
  1509. ' *****  SET/CHANGE SUBJECT FOR A MESSAGE   ***
  1510. '
  1511. 2065 IF SUBJECT$ <> "" THEN _
  1512.         A$ = "Change SUBJECT from " + _
  1513.              SUBJECT$ + _
  1514.              " to" : _
  1515.         GOSUB 12995 _
  1516.      ELSE A$ = "Subject" : _
  1517.           GOSUB 12998
  1518.      IF LEN(B$) > 25 THEN _
  1519.         A$ = "25 Char. Max" : _
  1520.         GOSUB 12979 : _
  1521.         GOTO 2065
  1522.      IF Q = 0 THEN _
  1523.         IF SUBJECT$ <> "" THEN _
  1524.            RETURN _
  1525.         ELSE GOSUB 2435 : _
  1526.              IF YES THEN _
  1527.                 RETURN 5160 _
  1528.              ELSE GOTO 2065
  1529.      SUBJECT$ = B$
  1530.      CALL ALLCAPS (SUBJECT$)
  1531.      ORIG.SUBJECT$ = SUBJECT$
  1532.      RETURN
  1533. '
  1534. ' *****  ENTER MAIN BODY OF MESSAGE  ****
  1535. '
  1536. 2100 A$ = "Type " + _
  1537.           MSG.HEADER$ + _                                            ' KG072003
  1538.           STR$(MAX.MESSAGE.LINES) + _
  1539.           " lines max" + _
  1540.           PRESS.ENTER$
  1541.      GOSUB 12975
  1542.      GOSUB 3200
  1543. 2125 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1544. 2127 IF REMOTE.ECHO OR LOCAL.USER THEN _
  1545.         A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + _
  1546.              ": " + _
  1547.              A$(LINES.IN.MESSAGE) _
  1548.      ELSE A$ = A$(LINES.IN.MESSAGE)
  1549.      GOSUB 12978
  1550.      CALL LINEEDIT(LINES.IN.MESSAGE,RIGHT.MARGIN + 1)
  1551.      IF WAIT.EXPIRED THEN _
  1552.         GOTO 10590 _
  1553.      ELSE IF SUBROUTINE.PARAMETER = -1 THEN _
  1554.              GOTO 10595
  1555.      CALL FINDFUNC
  1556.      IF SUBROUTINE.PARAMETER < 0 THEN _
  1557.         GOTO 202
  1558.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1559.         LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1 : _
  1560.         GOTO 2300
  1561. 2140 J = LINES.IN.MESSAGE
  1562.      GOSUB 2200
  1563.      IF X THEN _
  1564.         GOTO 2300
  1565.      GOTO 2125
  1566. 2200 X = 0
  1567.      IF J < (MAX.MESSAGE.LINES - 2) THEN _
  1568.         RETURN
  1569.      A$ = MID$("2 lines leftLast line   Full",12 * (J-(MAX.MESSAGE.LINES - 2)) + 1,12)
  1570.      X = (J > (MAX.MESSAGE.LINES - 1))
  1571. 2210 GOSUB 12979
  1572.      RETURN
  1573. '
  1574. ' *****  FINAL MESSAGE DISPOSITION   ****
  1575. '
  1576. 2300 CALL SKIPLINE (1)
  1577.      IF NOT EXPERT.USER THEN _
  1578.         CALL QTPUT1 ("A)bort," + LEFT$("B)tch Import,",-13 * (SYSOP OR LOCAL.USER)) + "C)ont,D)el,E)dit,I)nsert,L)ist,M)argin,R)ev subj,S)ave")
  1579. 2315 A$ = "Edit Sub-function <A," + _
  1580.           LEFT$("B,",-2 * (SYSOP OR LOCAL.USER)) + _
  1581.           "C,D,E,I,L,M,R,S,?>"
  1582.      CALL SKIPLINE (1)
  1583.      GOSUB 12999
  1584.      IF Q = 0 THEN _
  1585.         GOTO 2315
  1586.      CALL ALLCAPS (B$(1))
  1587.      Z$ = B$(1)
  1588. 2325 IF Q < 2 THEN _
  1589.         GOTO 2330
  1590.      CALL CHECKINT (B$(2))
  1591.      IF EC <> 0 THEN _
  1592.         GOTO 2300 _
  1593.      ELSE L = TESTED.INTEGER.VALUE : _
  1594.           GOSUB 3320
  1595.      IF Q > 2 THEN _
  1596.         CALL CHECKINT (B$(3)) : _
  1597.         IF EC <> 0 THEN _
  1598.            GOTO 2300 _
  1599.         ELSE MARK2 = TESTED.INTEGER.VALUE
  1600. 2330 ON INSTR("ABCDEILMRS?",Z$) GOTO 2400,2335,2332,2500,2600,2800,3000,3100,2440,3400,2345
  1601.      GOTO 2300
  1602. 2332 IF LINES.IN.MESSAGE < 1 THEN _
  1603.         LINES.IN.MESSAGE = 1
  1604.      GOTO 2127
  1605. 2335 X = LINES.IN.MESSAGE
  1606.      CALL MIMPORT (MAX.MESSAGE.LINES,RIGHT.MARGIN,LINES.IN.MESSAGE,A$())
  1607.      IF LINES.IN.MESSAGE > X THEN _
  1608.         GOTO 3000 _
  1609.      ELSE GOTO 2300
  1610. '
  1611. ' *****  DISPLAY MESSAGE SUBCOMMANDS HELP FILE   ****
  1612. '
  1613. 2345 FILE.NAME$ = HELP$(4)
  1614.      GOSUB 1790
  1615.      GOTO 2315
  1616. 2350 CALL FINDIT (MAIN.PUI$)
  1617.      CUSTOM.PUI = OK
  1618.      IF OK THEN _
  1619.         CURRENT.PUI$ = MAIN.PUI$ _
  1620.      ELSE CURRENT.PUI$ = ""
  1621.      RETURN
  1622. '
  1623. ' ****  ABORT MESSAGE   ***
  1624. '
  1625. 2400 GOSUB 2435
  1626.      IF NOT YES THEN _
  1627.         GOTO 2300
  1628. 2430 A$ = "Aborted"
  1629.      GOSUB 12975
  1630.      GOTO 3650
  1631. 2435 A$ = "Abort " + _
  1632.           MSG.HEADER$ + _                                            ' KG072003
  1633.           " (Y/[N])"
  1634.      GOSUB 12995
  1635.      RETURN
  1636. '
  1637. ' *****  CHANGE SUBJECT OF A MESSAGE  ****
  1638. '
  1639. 2440 GOSUB 2065
  1640.      GOTO 2300
  1641. '
  1642. ' *****  (BLOCK) DELETE MESSAGE LINE(S)  *****
  1643. '
  1644. 2500 CALL SKIPLINE (1)
  1645.      IF Q = 1 THEN _
  1646.         A$ = "Delete from " : _
  1647.         GOSUB 12978 : _
  1648.         GOSUB 3300
  1649.      MARK1 = L
  1650. 2520 IF Q < 3 THEN _
  1651.         A$ = "Up to and including " : _
  1652.         GOSUB 12978 : _
  1653.         GOSUB 3300 : _
  1654.         IF MARK2 = 0 THEN _
  1655.            MARK2 = L
  1656.      CALL SKIPLINE(1)
  1657.      IF MARK2 > LINES.IN.MESSAGE THEN _                              ' KG052001
  1658.         Q = 0 : _                                                    ' KG052001
  1659.         GOTO 2520                                                    ' KG052001
  1660.      IF MARK1 > MARK2 THEN _
  1661.         A$ = "BEGINNING exceeds END.  Block NOT deleted!" : _
  1662.         GOSUB 12979 : _
  1663.         GOTO 2555
  1664. 2522 FOR X = MARK1 TO MARK2
  1665.         CALL ASKMORE ("",TRUE,TRUE,XX,FALSE)
  1666.         IF NO OR RET THEN _
  1667.            X = MARK2 + 1 _
  1668.         ELSE A$ = A$(X) : _
  1669.            GOSUB 12977
  1670.      NEXT
  1671.      CALL SKIPLINE(1)
  1672. 2530 A$ = "Delete lines " + STR$(MARK1) + "-" + MID$(STR$(MARK2),2) + " (Y/[N])"
  1673.      GOSUB 12999
  1674.      IF NOT YES THEN _
  1675.         A$ = "NOT Deleted" : _
  1676.         GOSUB 12979 : _
  1677.         GOTO 2555
  1678. 2550 BLOCK.SIZE = (MARK2 - MARK1) + 1
  1679.      END.OF.BUFFER = LINES.IN.MESSAGE + 1
  1680.      LINES.IN.MESSAGE = LINES.IN.MESSAGE - BLOCK.SIZE
  1681.      FOR X = MARK1 TO LINES.IN.MESSAGE
  1682.         A$(X) = A$(X + BLOCK.SIZE)
  1683.      NEXT
  1684.      FOR X = (LINES.IN.MESSAGE + 1) TO (END.OF.BUFFER)
  1685.         A$(X) = ""
  1686.      NEXT
  1687.      A$ = "Deleted" + STR$(BLOCK.SIZE) + " line(s)"
  1688.      GOSUB 12979
  1689. 2555 MARK1 = 0
  1690.      MARK2 = 0
  1691.      GOTO 2300
  1692. '
  1693. ' ****  EDIT MESSAGE LINE  ***
  1694. '
  1695. 2600 CALL SKIPLINE (1)
  1696.      IF Q = 1 THEN _
  1697.         GOSUB 3300
  1698.      CALL EDITALINE (L)
  1699.      IF SUBROUTINE.PARAMETER < 0 THEN _
  1700.         GOTO 202
  1701.      GOTO 2300
  1702. 2800 IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES AND NOT SYSOP THEN _
  1703.         A$ = "Message full" : _
  1704.         GOSUB 12979 : _
  1705.         GOTO 2920
  1706. 2820 CALL SKIPLINE (1)
  1707.      IF Q = 1 THEN _
  1708.         A$ = "Before " : _
  1709.         GOSUB 12978 : _
  1710.         GOSUB 3300
  1711. 2830 LL = LINES.IN.MESSAGE
  1712.      K = LINES.IN.MESSAGE - L
  1713.      FOR X = L TO LINES.IN.MESSAGE
  1714.         B$(X + 1 - L) = A$(X)
  1715.         A$(X) = ""
  1716.      NEXT
  1717.      LINES.IN.MESSAGE = L
  1718. 2840 A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + _
  1719.           ": "
  1720.      GOSUB 12978
  1721.      CALL LINEEDIT(LINES.IN.MESSAGE,RIGHT.MARGIN + 1)
  1722.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1723.         GOTO 2920
  1724. 2870 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1725.      J = LINES.IN.MESSAGE + K - 1
  1726.      GOSUB 2200
  1727.      IF NOT X THEN _
  1728.         GOTO 2840
  1729. 2920 FOR X = 1 TO K + 1
  1730.         A$(LINES.IN.MESSAGE + X - 1) = B$(X)
  1731.      NEXT
  1732.      REDIM B$(ADIM)
  1733.      LINES.IN.MESSAGE = LL + LINES.IN.MESSAGE - L
  1734.      GOTO 2300
  1735. '
  1736. ' *****  LIST MESSAGE CONTENTS   ****
  1737. '
  1738. 3000 STOP.INTERRUPTS = FALSE
  1739.      CALL SKIPLINE (1)
  1740.      IF Q = 1 THEN _
  1741.         L = 1 : _
  1742.         A$ = FG.3$ + "To: " + _
  1743.              MESSAGE.TO$ + _
  1744.              FG.4$ + " Re: " + _
  1745.              SUBJECT$ + EMPHASIZE.OFF$ : _
  1746.         GOSUB 12979 : _
  1747.         CALL QTPUT (MID$("    ",1,-4 * (NOT REMOTE.ECHO)),0) : _
  1748.         GOSUB 3200
  1749. 3020 FOR X = L TO LINES.IN.MESSAGE
  1750.         CALL ASKMORE ("",TRUE,TRUE,XX,FALSE)
  1751.         IF NO OR RET THEN _
  1752.            X = LINES.IN.MESSAGE + 1 _
  1753.         ELSE A$ = RIGHT$(STR$(X),2) + _
  1754.                   ": " + _
  1755.                   A$(X) : _
  1756.              GOSUB 12979
  1757.      NEXT
  1758.      GOTO 2300
  1759. '
  1760. ' *****  CHANGE MARGIN WIDTH   ****
  1761. '
  1762. 3100 CALL SKIPLINE (1)
  1763.      IF Q <> 1 THEN _
  1764.         B$(1) = B$(Q) : _
  1765.         GOTO 3130
  1766. 3115 A$ = "SET Right-Margin from" + _
  1767.           STR$(RIGHT.MARGIN) + _
  1768.           " TO (8...72)"
  1769.      GOSUB 12995
  1770.      IF LEN(B$(1)) > 2 THEN _
  1771.         GOTO 3140
  1772. 3130 X = VAL(B$(1))
  1773.      IF X > 7 AND X < 73 THEN _
  1774.         RIGHT.MARGIN = X : _
  1775.         A$ = "Margin now" + _
  1776.              STR$(RIGHT.MARGIN) : _
  1777.         GOTO 3150
  1778. 3140 A$ = "Invalid - Margin UNCHANGED"
  1779. 3150 GOSUB 12979
  1780.      IF UTILITY.MARGIN.CHANGE THEN _
  1781.         RETURN
  1782.      GOTO 2300
  1783. 3200 A$ = "[" + _
  1784.           STRING$(RIGHT.MARGIN - 2,45) + _
  1785.           "]"
  1786.      IF REMOTE.ECHO OR LOCAL.USER THEN _
  1787.         A$ = "    " + _
  1788.              A$
  1789.      GOSUB 12975
  1790.      RETURN
  1791. 3300 A$ = "Line #"
  1792.      IF MARK1 <> 0 THEN _
  1793.         A$ = "Line # (ENTER =" + STR$(MARK1) + ")"
  1794.      GOSUB 12995
  1795.      CALL CHECKINT (B$(1))
  1796.      IF EC > 0 THEN _
  1797.         GOTO 3340
  1798.      L = TESTED.INTEGER.VALUE
  1799. 3320 IF L >= 1 AND L <= LINES.IN.MESSAGE THEN _
  1800.         RETURN
  1801. 3330 IF Q = 0 THEN _
  1802.         IF MARK1 = 0 THEN _
  1803.            RETURN 2300 _
  1804.         ELSE MARK2 = MARK1 : _
  1805.              RETURN
  1806. 3340 A$ = "No such line"
  1807.      GOSUB 12979
  1808.      RETURN 2300
  1809. '
  1810. ' ****  SAVE MESSAGE   ***
  1811. '
  1812. 3400 IF GET.EXT.DESC THEN _
  1813.         SYSOP.COMMENT = FALSE : _
  1814.         RETURN
  1815.      IF SYSOP.COMMENT THEN _
  1816.         SYSOP.COMMENT = FALSE : _
  1817.         GOTO 1850
  1818. 3405 GOSUB 4910
  1819.      MESSAGE.RECORD.SAVE$ = MESSAGE.RECORD$
  1820.      MSG.CORRECTED = FALSE
  1821.      GOSUB 23100
  1822.      A$ = "Adding new msg #" + _
  1823.           STR$(HIGH.MESSAGE.NUMBER + 1)
  1824.      IF NOT LOCAL.USER THEN _
  1825.         CALL UPDTCALR (A$,1)
  1826.      GOSUB 12978
  1827.      SL = 0
  1828.      N$ = ""
  1829.      IF LOW.MESSAGE.NUMBER = 0 THEN _
  1830.         LOW.MESSAGE.NUMBER = 1 : _
  1831.         HIGH.MESSAGE.NUMBER = 1 _
  1832.      ELSE HIGH.MESSAGE.NUMBER = HIGH.MESSAGE.NUMBER + 1
  1833. 3410 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1834.      MESSAGE.NUMBER$ = STR$(HIGH.MESSAGE.NUMBER) + _
  1835.                        SPACE$(5 - LEN(STR$(HIGH.MESSAGE.NUMBER)))
  1836.      IF MESSAGE.PASSWORD$ = "^READ^" THEN _
  1837.         MID$(MESSAGE.NUMBER$,1,1) = "*" : _
  1838.         SSS = PRIVATE.READ.SEC _
  1839.      ELSE SSS = PUBLIC.READ.SEC
  1840. 3460 MESSAGE.FROM$ = LEFT$(ACTIVE.USER.NAME$ + SPACE$(31),31)
  1841.      MESSAGE.TO$ = LEFT$(MESSAGE.TO$ + SPACE$(31),31)
  1842.      MID$(MESSAGE.TO$,23,8) = TIME$
  1843.      SUBJECT$ = LEFT$(ORIG.SUBJECT$ + SPACE$(25),25)
  1844.      MESSAGE.PASSWORD$ = LEFT$(MESSAGE.PASSWORD$ + SPACE$(15),15)
  1845.      IF QUOTED.REPLY AND _
  1846.         LINES.IN.MESSAGE > MAX.MESSAGE.LINES THEN _
  1847.            LINES.IN.MESSAGE = MAX.MESSAGE.LINES
  1848.      FOR J = 1 TO LINES.IN.MESSAGE
  1849.         A$(J) = A$(J) + _
  1850.                 CHR$(227)
  1851.         SL = SL + LEN(A$(J))
  1852.      NEXT
  1853.      IF SL MOD 128 = 0 THEN _
  1854.         N$ = STR$(SL \ 128 + 1) _
  1855.      ELSE N$ = STR$(SL \ 128 + 2)
  1856. 3530 TEMP = NEXT.MESSAGE.RECORD
  1857.      NEXT.MESSAGE.RECORD = TEMP + VAL(N$)
  1858.      LSET MESSAGE.RECORD$ = MESSAGE.RECORD.SAVE$
  1859.      GOSUB 24000
  1860.      GET 1,TEMP
  1861.      M(ACTIVE.MESSAGES,1) = TEMP
  1862.      M(ACTIVE.MESSAGES,2) = HIGH.MESSAGE.NUMBER
  1863.      LSET MESSAGE.RECORD$ = MESSAGE.NUMBER$ + _
  1864.                             MESSAGE.FROM$ + _
  1865.                             MESSAGE.TO$ + _
  1866.                             CURRENT.DATE$ + _
  1867.                             SUBJECT$ + _
  1868.                             MESSAGE.PASSWORD$ + _
  1869.                             ACTIVE.MESSAGE$ + _
  1870.                             N$ + _
  1871.                             SPACE$(4 - LEN(N$)) + _
  1872.                             MKI$(SSS)
  1873.      PUT 1,TEMP
  1874.      N$ = ""
  1875.      NUM.DOTS = 0
  1876.      FOR J = 1 TO LINES.IN.MESSAGE
  1877.         CALL MARKTIME (NUM.DOTS)
  1878.         N$ = N$ + _
  1879.              A$(J)
  1880.         IF LEN(N$) > 127 THEN _
  1881.            LSET MESSAGE.RECORD$ = N$ : _
  1882.            PUT 1 : _
  1883.            N$ = MID$(N$,129)
  1884. 3630 NEXT
  1885.      IF LEN(N$) > 0 THEN _
  1886.         LSET MESSAGE.RECORD$ = N$ : _
  1887.         PUT 1
  1888.      REDIM A$(ADIM)
  1889.      IF MSG.CORRECTED THEN _
  1890.         MSG.CORRECTED = FALSE : _
  1891.         ACTION.FLAG = TRUE : _
  1892.         CALL SKIPLINE (1) : _
  1893.         GOSUB 1900
  1894. 3640 CALL SKIPLINE (1)
  1895.      GET 1,1
  1896.      GOSUB 12985
  1897. ' ---[ notify receiver that has new mail waiting ]---
  1898.      IF RECEIVER.RECORD.NUM > 0 THEN _
  1899.         SUIX = USER.FILE.INDEX : _
  1900.         USER.RECORD.HOLD$ = USER.RECORD$ : _
  1901.         USER.FILE.INDEX = RECEIVER.RECORD.NUM : _
  1902.         GOSUB 12989 : _
  1903.         GET 5, RECEIVER.RECORD.NUM : _
  1904.         X = CVI(MID$(USER.RECORD$,57,2)) : _
  1905.         MID$(USER.RECORD$,57,2) = MKI$(X OR 512) : _
  1906.         PUT 5, RECEIVER.RECORD.NUM : _
  1907.         GOSUB 12991 : _
  1908.         USER.FILE.INDEX = SUIX : _
  1909.         LSET USER.RECORD$ = USER.RECORD.HOLD$ : _
  1910.         CALL QTPUT1 ("Receiver will be notified of new mail") : _
  1911.         RECEIVER.RECORD.NUM = 0
  1912. 3650 QUOTED.REPLY = FALSE
  1913.      IF JUST.BROWSING THEN _
  1914.         ADD.TO.CONF = TRUE : _
  1915.         CALL QTPUT1 ("Adding you to " + GRN$) : _
  1916.         JUST.BROWSING = FALSE : _
  1917.         Z$ = GRN.NAME$ : _
  1918.         GRN$ = Z$ : _
  1919.         GOSUB 5328
  1920.      IF REPLY THEN _
  1921.         REPLY = FALSE : _
  1922.         GOTO 5344
  1923.      IF GET.EXT.DESC THEN _
  1924.         LINES.IN.MESSAGE = 0 : _
  1925.         RETURN
  1926.      RETURN 1200
  1927. '
  1928. ' ****  K - COMMAND FROM MAIN MENU (KILL MESSAGE)  ***
  1929. '
  1930. 3900 KILL.MESSAGE = FALSE
  1931.      CALL SKIPLINE (1)
  1932.      IF Q <> 1 THEN _
  1933.         TEMP = 2 : _
  1934.         GOTO 3935
  1935. 3930 A$ = "Msg #(s) to Kill" + PRESS.ENTER.EXPERT$
  1936.      GOSUB 12995
  1937.      IF Q = 0 THEN _
  1938.         RETURN
  1939.      GOSUB 1893
  1940.      TEMP = 1
  1941. 3935 CALL CHECKINT (B$(TEMP))
  1942.      IF EC <> 0 THEN _
  1943.         GOTO 3930
  1944.      MESSAGE.TO.KILL = TESTED.INTEGER.VALUE
  1945. 3950 GOSUB 5344
  1946.      CALL KILLMSG (MESSAGE.TO.KILL,ACTIVE.MESSAGES)
  1947. 4040 IF TEMP < Q THEN _
  1948.         TEMP = TEMP + 1 : _
  1949.         GOTO 3935
  1950.      IF KILL.MESSAGE THEN _
  1951.         RETURN
  1952.      GOTO 3930
  1953. '
  1954. ' ****  Sysop Available toggle
  1955. '
  1956. 4130  SUBROUTINE.PARAMETER = -8
  1957.       CALL FINDFUNC
  1958.       SUBROUTINE.PARAMETER = 0
  1959.       RETURN
  1960. '
  1961. ' ****  X)pert Toggle
  1962. '
  1963. 4240 CALL TOGGLE(9)
  1964.      RETURN
  1965. '
  1966. ' ****  T)opic - QUICK SCAN MESSAGES  ***
  1967. '
  1968. 4320 QUICK.SCAN.MESSAGES = TRUE
  1969.      READ.MESSAGES = FALSE
  1970.      SCAN.MESSAGES = FALSE
  1971.      MSG.START = 76
  1972.      MSG.END = 100
  1973.      SEC.INDEX= 0
  1974.      GOTO 4350
  1975. '
  1976. ' ****  R - COMMAND FROM MAIN MENU (READ MESSAGES)  ****
  1977. '
  1978. 4330 QUICK.SCAN.MESSAGES = FALSE
  1979.      READ.MESSAGES = TRUE
  1980.      HIGHLITE.REC = -1
  1981.      SCAN.MESSAGES = FALSE
  1982.      MSG.START = 6
  1983.      MSG.END = 100
  1984.      IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  1985.         IF READ.MSG.IN$ <> ACTIVE.MESSAGE.FILE$ THEN _
  1986.            READ.MSG.IN$ = ACTIVE.MESSAGE.FILE$ : _
  1987.            CALL UPDTCALR ("Read Messages in " + READ.MSG.IN$,1)
  1988.      GOSUB 1300
  1989.      GOTO 4350
  1990. '
  1991. ' ****  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)  ***
  1992. '
  1993. 4340 IF Q < 2 THEN _
  1994.         GOSUB 1300
  1995. 4345 QUICK.SCAN.MESSAGES = FALSE
  1996.      READ.MESSAGES = FALSE
  1997.      SCAN.MESSAGES = TRUE
  1998.      MSG.START = 6
  1999.      MSG.END = 100
  2000.      SEC.INDEX = 0
  2001. '
  2002. ' ** MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN) ALL USE THIS ROUTINE *
  2003. '
  2004. 4350 SEARCH.HEADER$ = ""
  2005. 4352 SEARCH.STRING$ = ""
  2006.      DONT.PRINT = FALSE
  2007.      JUST.REPLIED = FALSE
  2008.      QUOTED.REPLY = FALSE
  2009.      CAN.KILL = (SYSOP OR USER.SECURITY.LEVEL >= SEC.KILL.ANY)
  2010.      GOSUB 1893
  2011.      GOSUB 5344
  2012.      Z$ = ""
  2013.      FOR I = 2 TO Q
  2014.         IF INSTR("Ss*",B$(I)) > 0 THEN _
  2015.            B$(I) = MID$(STR$(LAST.MESSAGE.READ+1),2) + "+"
  2016.         IF LEN(B$(I)) = 1 THEN _
  2017.            IF INSTR("Cc",B$(I)) > 0 THEN _
  2018.               NON.STOP = TRUE
  2019.         IF INSTR("Ll",B$(I)) > 0 THEN _
  2020.            B$(I) = MID$(STR$(HIGH.MESSAGE.NUMBER),2) + "-"
  2021.      NEXT
  2022. 4360 LG$(11) = Z$
  2023.      MESSAGES.SELECTED.INDEX = 1
  2024.      NUMBER.MESSAGES.SELECTED = Q
  2025.      ADDRESSED.TO.USER = FALSE
  2026.      TO.REQUESTED = FALSE
  2027.      FROM.REQUESTED = FALSE
  2028.      IF PAGE.LENGTH < 1 THEN _
  2029.         NON.STOP = TRUE
  2030. 4370 MESSAGES.SELECTED.INDEX = MESSAGES.SELECTED.INDEX  + 1
  2031. 4371 IF MESSAGES.SELECTED.INDEX <= NUMBER.MESSAGES.SELECTED THEN _
  2032.         CALL CHECKINT (B$(MESSAGES.SELECTED.INDEX)) : _
  2033.         IF EC <> 0 THEN _
  2034.            EL = 4371 : _
  2035.            GOTO 13000 _
  2036.         ELSE CURRENT.MESSAGE = TESTED.INTEGER.VALUE : _
  2037.              GOTO 4415
  2038. 4380 NON.STOP = (PAGE.LENGTH < 1)                                    ' KG072603
  2039.      A1$ = "Msg #" + _
  2040.            STR$(LOW.MESSAGE.NUMBER) + _
  2041.            "-" + _
  2042.            MID$(STR$(M(ACTIVE.MESSAGES,2)),2) + _
  2043.            " (H)elp,S)ince,L)ast"
  2044.      IF ADDRESSED.TO.USER OR TO.REQUESTED OR FROM.REQUESTED THEN _
  2045.         Y$ = LEFT$("TO",-2*(TO.REQUESTED OR ADDRESSED.TO.USER)) + _
  2046.              LEFT$("/",-ADDRESSED.TO.USER) + _
  2047.              LEFT$("FROM",-4*(FROM.REQUESTED OR ADDRESSED.TO.USER)) : _
  2048.         CALL QTPUT1 ("Only msgs "+Y$+" you.  Read from what msg # (e.g. 1+,4010-)") _
  2049.      ELSE A1$ = A1$ + _
  2050.                ", T)o,F)rom,M)ine"
  2051.      IF SEARCH.STRING$ = "" THEN _
  2052.         A1$ = A1$ + _
  2053.              ", text" _
  2054.      ELSE CALL QTPUT1 ("Only msgs with text " + SEARCH.STRING$ + ".  Read from what msg # (e.g. 1+,4010-)")
  2055. 4390 A$ = A1$ + ", [Q]uit)"
  2056.      MACRO.MIN = 99
  2057. 4400 GOSUB 12995
  2058.      IF Q = 0 THEN _
  2059.         RETURN
  2060. 4402 IF LEN(B$(1)) = 1 THEN _
  2061.         IF INSTR("Qq",B$) THEN _
  2062.            RETURN _
  2063.         ELSE IF INSTR("Hh",LEFT$(B$(1),1)) THEN _
  2064.                 FILE.NAME$ = HELP.PATH$ + "MR" + HELP.EXTENSION$ : _
  2065.                 GOSUB 1790 : _
  2066.                 GOTO 4390
  2067.      MESSAGES.SELECTED.INDEX = 0
  2068.      NUMBER.MESSAGES.SELECTED = Q
  2069.      GOTO 4370
  2070. 4415 FORWARD = FALSE
  2071.      REVERSE = FALSE
  2072.      IF LEN(B$(MESSAGES.SELECTED.INDEX)) = 1 THEN _
  2073.         IF INSTR("Ss*",B$(MESSAGES.SELECTED.INDEX)) > 0 THEN _
  2074.            CURRENT.MESSAGE = LAST.MESSAGE.READ + 1 : _
  2075.            FORWARD = TRUE : _
  2076.            GOTO 4430 _
  2077.         ELSE IF INSTR("Ll",B$(MESSAGES.SELECTED.INDEX)) > 0 THEN _
  2078.                 CURRENT.MESSAGE = HIGH.MESSAGE.NUMBER : _
  2079.                 REVERSE = TRUE : _
  2080.                 GOTO 4490
  2081. 4416 IF INSTR("Mm",B$(MESSAGES.SELECTED.INDEX)) THEN _
  2082.         ADDRESSED.TO.USER = TRUE : _
  2083.         GOTO 4370
  2084.      A = INSTR("FfTt",B$(MESSAGES.SELECTED.INDEX))
  2085.      IF A > 0 THEN _
  2086.         TO.REQUESTED = (A > 2) : _
  2087.         FROM.REQUESTED = (A < 3) : _
  2088.         GOTO 4370
  2089.      IF CURRENT.MESSAGE = 0 THEN _
  2090.         IF SEARCH.HEADER$ <> "" THEN _
  2091.            GOTO 4370 _
  2092.         ELSE SEARCH.STRING$ = B$(MESSAGES.SELECTED.INDEX) : _
  2093.              CALL ALLCAPS (SEARCH.STRING$) : _
  2094.              CALL REMOVE (SEARCH.STRING$,CHR$(34) + CHR$(39)) : _
  2095.              SEARCH.HEADER$ = SEARCH.STRING$ : _
  2096.              GOTO 4370
  2097.      CALL SKIPLINE (1)
  2098. 4430 IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "+" THEN _
  2099.         FORWARD = TRUE
  2100.      IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "-" THEN _
  2101.         REVERSE = TRUE : _
  2102.         GOTO 4490
  2103. 4450 MESSAGE.DIM.INDEX = 1
  2104. 4452 IF MESSAGE.DIM.INDEX > ACTIVE.MESSAGES THEN _
  2105.         GOTO 4515
  2106.      IF READ.MESSAGES AND _
  2107.         M(MESSAGE.DIM.INDEX,2) = CURRENT.MESSAGE THEN _
  2108.         GOTO 4520
  2109. 4470 IF ((READ.MESSAGES AND FORWARD) OR _
  2110.         QUICK.SCAN.MESSAGES OR SCAN.MESSAGES) AND _
  2111.         M(MESSAGE.DIM.INDEX,2) >= CURRENT.MESSAGE THEN _
  2112.         GOTO 4520
  2113. 4480 MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX + 1
  2114.      GOTO 4452
  2115. 4490 MESSAGE.DIM.INDEX = ACTIVE.MESSAGES
  2116. 4492 IF MESSAGE.DIM.INDEX < 1 THEN _
  2117.         GOTO 4515
  2118.      IF M(MESSAGE.DIM.INDEX,2) <= CURRENT.MESSAGE THEN _
  2119.         GOTO 4540
  2120. 4510 MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX - 1
  2121.      GOTO 4492
  2122. 4515 IF FORWARD THEN _
  2123.         A$ = "No new messages" _
  2124.      ELSE A$ = "No such msg #" + _
  2125.                STR$(CURRENT.MESSAGE)
  2126.      GOSUB 12979
  2127.      GOTO 4370
  2128. 4520 ENDING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2129.      IF READ.MESSAGES AND NOT FORWARD THEN _
  2130.         GOTO 4560
  2131. 4530 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2132.      ENDING.MESSAGE.INDEX = ACTIVE.MESSAGES
  2133.      SO = 1
  2134.      GOTO 4550
  2135. 4540 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2136.      ENDING.MESSAGE.INDEX = 1
  2137.      SO = -1
  2138. 4550 XXX = ENDING.MESSAGE.INDEX + SO
  2139.      MESSAGE.DIM.INDEX = STARTING.MESSAGE.INDEX
  2140. 4552 IF MESSAGE.DIM.INDEX = XXX THEN _
  2141.         CALL CARRIER : _                                             ' KG061203
  2142.         GOTO 4637
  2143. 4560   CURRENT.HEADER = M(MESSAGE.DIM.INDEX,1)
  2144.        IF CURRENT.HEADER < 1 THEN _
  2145.           GOTO 4515
  2146.        GET 1,CURRENT.HEADER
  2147.        PASSWORD.FAILED = 0
  2148.        UH = 0
  2149.        Z$ = MID$(MESSAGE.RECORD$,101,15)
  2150.        X = 1
  2151. 4561   X$ = MID$(MESSAGE.RECORD$,X)
  2152.        FF = INSTR(X$,MESSAGE.USER.NAME$)
  2153.        IF FF > 0 THEN _
  2154.           X = LEN(MESSAGE.USER.NAME$) _
  2155.        ELSE IF SYSOP THEN _
  2156.                FF = INSTR(X$,"SYSOP") : _
  2157.                X = 5 : _
  2158.                IF FF = 0 THEN _
  2159.                   X = LEN(SYSOP.FULL.NAME$) : _
  2160.                   FF = INSTR(X$,SYSOP.FULL.NAME$)
  2161.        IF FF > 0 THEN _
  2162.           X = X + FF : _
  2163.           IF (FF < 7 OR MID$(MESSAGE.RECORD$,FF - 1,1) = " ") AND (X > 58 OR MID$(MESSAGE.RECORD$,X,1) = " ") THEN _
  2164.              UH = TRUE _
  2165.           ELSE IF FF < 37 THEN _
  2166.                   X = 37 : _
  2167.                   GOTO 4561
  2168.        MSG.TO.CALLER = UH AND (FF = 37)
  2169.        MSG.FROM.CALLER = UH AND (FF = 6)
  2170.        GOSUB 4655                                                    ' KG060901
  2171. 4562   IF NOT CAN.KILL THEN _
  2172.           IF INSTR(MESSAGE.RECORD$,"^READ^") > 0 AND NOT UH THEN _
  2173.              PASSWORD.FAILED = TRUE : _
  2174.              IF FORWARD OR REVERSE THEN _
  2175.                 GOTO 4635
  2176. 4563   CURRENT.MESSAGE = VAL(MID$(MESSAGE.RECORD$,2,4))
  2177.        IF TO.REQUESTED THEN _
  2178.           IF NOT MSG.TO.CALLER THEN _
  2179.              GOTO 4625
  2180.        IF FROM.REQUESTED THEN _
  2181.           IF NOT MSG.FROM.CALLER THEN _
  2182.              GOTO 4625
  2183.        IF ADDRESSED.TO.USER AND NOT UH THEN _
  2184.           GOTO 4625
  2185.        X$ = MID$(MESSAGE.RECORD$,121,2)
  2186.        IF X$ = "  " THEN _
  2187.           MESSAGE.SECURITY = MINIMUM.LOGON.SECURITY _
  2188.        ELSE MESSAGE.SECURITY = CVI(X$)
  2189.        IF USER.SECURITY.LEVEL < MESSAGE.SECURITY THEN _
  2190.           GOTO 4625
  2191. 4580   IF INSTR(MESSAGE.RECORD$,LG$(11)) = 0 THEN _
  2192.           GOTO 4635
  2193. 4581   IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ THEN _
  2194.           GOTO 4630
  2195.        JUST.SEARCHING = FALSE
  2196.        IF SEARCH.HEADER$ <> "" THEN _
  2197.           FF = INSTR(MESSAGE.RECORD$,SEARCH.HEADER$) : _
  2198.           IF FF >= MSG.START AND FF <= MSG.END THEN _
  2199.              HIGHLITE.POS = FF : _
  2200.              GOTO 4582 _
  2201.           ELSE IF READ.MESSAGES AND SEARCH.STRING$ <> "" THEN _
  2202.                   JUST.SEARCHING = TRUE : _
  2203.                   GOTO 4582 _
  2204.                ELSE GOTO 4625
  2205. 4582   PG = FALSE
  2206.        IF MID$(Z$,1,1) = "!" THEN _
  2207.           IF NOT CAN.KILL THEN _
  2208.              PG = TRUE : _
  2209.              PASSWORD.SAVE$ = MID$(Z$,2) + _
  2210.                               " " : _
  2211.              ATTEMPTS.ALLOWED = 0 : _
  2212.              SUBROUTINE.PARAMETER = 1 : _
  2213.              CALL PASSWRD
  2214. 4584   IF PASSWORD.FAILED AND _
  2215.           (QUICK.SCAN.MESSAGES OR (SCAN.MESSAGES AND NOT PG)) THEN _
  2216.           GOTO 4635
  2217. 4585   IF PASSWORD.FAILED THEN _
  2218.           IF PG THEN _
  2219.              SJ$ = "<PASSWORD>" _
  2220.           ELSE SJ$ = "<PROTECTED>" _
  2221.        ELSE SJ$ = MID$(MESSAGE.RECORD$,76,25)
  2222. 4590   IF QUICK.SCAN.MESSAGES THEN _
  2223.           A$ = LEFT$(MESSAGE.RECORD$,5) + _
  2224.                " " + _
  2225.                LEFT$(SJ$,19) + _
  2226.                " " : _
  2227.           CALL CHKCOLOR (A$,SEARCH.HEADER$,EMPHASIZE.OFF$) : _
  2228.           GOSUB 12978 : _
  2229.           SEC.INDEX = SEC.INDEX + 1 : _
  2230.           IF SEC.INDEX = 3 THEN _
  2231.              SEC.INDEX = 0 : _
  2232.              CALL SKIPLINE (1) : _
  2233.              GOTO 4630  _
  2234.           ELSE GOTO 4630
  2235. 4600   IF SCAN.MESSAGES THEN _
  2236.           GOSUB 8020 : _
  2237.           GOTO 4630
  2238.        IF NOT JUST.SEARCHING THEN _
  2239.           GOSUB 8000 : _
  2240.           IF QUOTED.REPLY = TRUE THEN _
  2241.              GOTO 4610
  2242.        IF RET THEN _
  2243.           GOTO 4630                                                  ' KG060901
  2244.        CAN.CHG.SEC = (USER.SECURITY.LEVEL => SEC.CHANGE.MSG)
  2245.        IF EXPERT.USER THEN _
  2246.           A1$ = ",R,T,=,+,-" + _
  2247.                 MID$(",K",1,- (UH OR CAN.KILL) * 2) + _
  2248.                 MID$(",S",1, - CAN.CHG.SEC * 2) _
  2249.        ELSE A1$ = ",R)eply,T)hread,=)reread,+,-" + _
  2250.                   MID$(",K)ill",1, - (UH OR CAN.KILL) * 7) + _
  2251.                   MID$(",S)ec chg",1, - CAN.CHG.SEC * 12)
  2252.        TURBO.KEY = -TURBO.KEY.USER
  2253.        IF JUST.SEARCHING OR NOT JUST.REPLIED THEN _
  2254.           GOTO 4610
  2255.        JUST.REPLIED = FALSE                                          ' KG060901
  2256.        CALL ASKMORE (A1$,TRUE,FALSE,MESSAGES.SELECTED.INDEX,FALSE)
  2257.        CALL SKIPLINE (1)
  2258.        IF NO THEN _
  2259.           RETURN
  2260.        CALL ALLCAPS (B$)
  2261.        REPLY = (REPLY OR B$ = "R")
  2262.        IF B$ <> "=" THEN _
  2263.           GOTO 4618
  2264.        CALL SKIPLINE (1)
  2265. 4610   IF NOT PASSWORD.FAILED THEN _
  2266.           GOTO 4613
  2267.        IF PG AND (NOT NON.STOP) THEN _
  2268.           ATTEMPTS.ALLOWED = 2 : _
  2269.           SUBROUTINE.PARAMETER = 2 : _
  2270.           CALL PASSWRD
  2271. 4611   IF PASSWORD.FAILED THEN _
  2272.           GOTO 4625
  2273. 4613   GOSUB 9000
  2274.        DONT.PRINT = FALSE
  2275.        IF JUST.SEARCHING THEN _
  2276.           GOTO 4625
  2277.        IF MESSAGES.SELECTED.INDEX > NUMBER.MESSAGES.SELECTED THEN _
  2278.           GOTO 4650
  2279.        CALL SKIPLINE (1)
  2280. 4614   GOSUB 41000
  2281.        KILL.MESSAGE = FALSE
  2282.        REPLY = FALSE
  2283.        IF NON.STOP THEN _
  2284.           GOTO 4625
  2285. 4616   TURBO.KEY = -TURBO.KEY.USER
  2286.        CALL ASKMORE (A1$,TRUE,FALSE,XX,FALSE)
  2287.        IF NO THEN _
  2288.           RETURN
  2289.        CALL ALLCAPS(B$(1))
  2290.        REPLY = (REPLY OR B$(1) ="R")
  2291.        IF B$(1) = "=" THEN _
  2292.           CALL SKIPLINE (1) : _
  2293.           GOTO 4560
  2294. '
  2295. ' ****  CHECK FOR CHANGE SECURITY  ***
  2296. '
  2297. 4618  IF B$(1) = "S" AND CAN.CHG.SEC THEN _
  2298.          GOSUB 4665
  2299.       IF B$(1) = "T" THEN _
  2300.          CALL SETTHREAD (CURRENT.MESSAGE, ORIG.SUBJECT$) : _
  2301.          IF Q > 0 THEN _
  2302.             SEARCH.HEADER$ = B$(2) : _
  2303.             CALL REMOVE (SEARCH.HEADER$,CHR$(34)+CHR$(39)) : _
  2304.             GOTO 4352
  2305.       A = INSTR(" +-",B$(1))
  2306.       IF A > 1 THEN _
  2307.          CURRENT.MESSAGE = CURRENT.MESSAGE + 5 - 2 * A : _
  2308.          FORWARD = (A = 2) : _
  2309.          REVERSE = (NOT FORWARD) : _
  2310.          SEARCH.STRING$ = "" : _
  2311.          IF REVERSE THEN _
  2312.             GOTO 4490 _
  2313.          ELSE GOTO 4450
  2314. '
  2315. ' ****  KILL CURRENT MESSAGE  ***
  2316. '
  2317.       IF KILL.MESSAGE AND (UH OR CAN.KILL) THEN _
  2318.          IF USER.SECURITY.LEVEL >= OPT.SEC(9) THEN _
  2319.             CALL PUTMATTR : _
  2320.             MESSAGE.TO.KILL = CURRENT.MESSAGE : _
  2321.             TEMP = Q : _
  2322.             GOSUB 3950 : _
  2323.             CALL GETMATTR : _
  2324.             GOTO 4625 _
  2325.          ELSE VIOLATION$ = "MORE KILL" : _
  2326.               GOSUB 1380 : _
  2327.               GOTO 4625
  2328. '
  2329. ' ****  REPLY TO CURRENT MESSAGE  ***
  2330. '
  2331. 4620   IF NOT REPLY THEN _
  2332.           GOTO 4625
  2333. 4621   IF USER.SECURITY.LEVEL < OPT.SEC(5) THEN _
  2334.           VIOLATION$ = "MORE RE" : _
  2335.           GOSUB 1380 : _
  2336.           REPLY = FALSE : _
  2337.           GOTO 4625
  2338.        IF LEFT$(SUBJECT$,3) <> "(R)" THEN _
  2339.           ORIG.SUBJECT$ = "(R)" + _                                  ' KG060102
  2340.                      LEFT$(ORIG.SUBJECT$,22)
  2341. 4622   MESSAGE.TO$ = MESSAGE.FROM$
  2342.        CALL TRIM (MESSAGE.TO$)
  2343.        MESSAGE.FROM$ = ACTIVE.USER.NAME$
  2344.        DONT.PRINT = FALSE
  2345.        CALL PUTMATTR
  2346.        A$ = "Quote " + MESSAGE.TO$ + "'s message (Y/[N])"
  2347.        GOSUB 12999
  2348.        IF RET OR NOT YES THEN _
  2349.           GOTO 4623
  2350.        QUOTED.REPLY = TRUE
  2351.        LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1                       ' KG061202
  2352.        CALL WORDWRAP (RIGHT.MARGIN-2,LINES.IN.MESSAGE,A$())
  2353.        IF LINES.IN.MESSAGE > ADIM THEN _
  2354.           LINES.IN.MESSAGE = ADIM : _
  2355.           CALL QTPUT1 ("Quote truncated to " + _
  2356.                       STR$(ADIM) + " lines for editing!")
  2357.        FOR X = 1 TO LINES.IN.MESSAGE
  2358.           IF LEFT$(A$(X),1) = ">" THEN _                             ' KG061202
  2359.              A$(X) = ">" + A$(X) _                                   ' KG061202
  2360.           ELSE A$(X) = "> " + A$(X)                                  ' KG061202
  2361.        NEXT
  2362.        GOSUB 2001
  2363.        IF ACTIVE.MESSAGES >= MAXIMUM.MESSAGES THEN _
  2364.           GOTO 4624
  2365.        Z$ = "L"
  2366.        L = 1
  2367.        IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES THEN _
  2368.           CALL QTPUT ("Msg cannot exceed" + _
  2369.                       STR$(MAX.MESSAGE.LINES) + " lines! ",0)
  2370.        CALL QTPUT1 ("Please delete unneeded lines (eg. d 1 5)")
  2371.        GOSUB 2325
  2372.        GOTO 4624
  2373. 4623   GOSUB 2000
  2374. 4624   REPLY = FALSE
  2375.        JUST.REPLIED = TRUE
  2376.        QUOTED.REPLY = TRUE
  2377.        CALL GETMATTR
  2378.        DONT.PRINT = TRUE
  2379.        B$ = "="
  2380.        QUOTED.REPLY = TRUE
  2381.        GOTO 4560
  2382. 4625   QUOTED.REPLY = FALSE
  2383.        JUST.REPLIED = FALSE
  2384.        IF NOT FORWARD AND NOT REVERSE THEN _
  2385.           GOTO 4370
  2386. 4630   CALL ASKMORE (",#(s) to read",TRUE,TRUE,XX,FALSE)
  2387.        IF Q = 0 OR YES THEN _                                        ' KG072701
  2388.           GOTO 4631
  2389.        IF NO THEN _
  2390.           RETURN
  2391.        IF SUBROUTINE.PARAMETER = -1 THEN _
  2392.           RETURN 10595
  2393.        IF RET THEN _
  2394.           RETURN
  2395.        Z$ = B$(1)
  2396.        CALL ALLCAPS (Z$)
  2397.        IF VAL(Z$) > 0 THEN _
  2398.           FOR I = Q TO 1 STEP -1 : _
  2399.              B$(I + 1) = B$(I) : _
  2400.           NEXT : _
  2401.           B$(1) = MID$(ALL.OPTS$,INSTR(ORIG.COMMANDS$,"R"),1)        ' EC062401
  2402.           Q = Q + 1 : _
  2403.           RETURN 1235
  2404. 4631   CALL CHKCARRIER                                               ' KG061203
  2405.        IF SUBROUTINE.PARAMETER THEN _
  2406.           RETURN 10595
  2407.        IF RET THEN _
  2408.           RETURN
  2409. 4635 IF SO = 0 THEN _
  2410.         SO = 1
  2411.      MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX + SO
  2412.      GOTO 4552
  2413. 4637 IF READ.MESSAGES THEN _
  2414.         SEARCH.STRING$ = "" : _
  2415.         SEARCH.HEADER$ = "" : _
  2416.         TO.REQUESTED = FALSE : _
  2417.         FROM.REQUESTED = FALSE : _
  2418.         ADDRESSED.TO.USER = FALSE : _
  2419.         GOTO 4370
  2420. 4650 CALL SKIPLINE (1) 'GOSUB 12979
  2421.      CALL QTPUT1 ("End Msgs")
  2422.      RETURN
  2423. 4655 IF SEARCH.STRING$ <> "" OR NOT READ.MESSAGES THEN _   ' update last message read ' KG060901
  2424.         RETURN                                                       ' KG060901
  2425. 4656 IF M(MESSAGE.DIM.INDEX,2) > LAST.MESSAGE.READ THEN _            ' KG060901
  2426.         MAIL.WAITING = FALSE : _                                     ' KG060901
  2427.         LAST.MESSAGE.READ = M(MESSAGE.DIM.INDEX,2)                   ' KG060901
  2428.      RETURN                                                          ' KG060901
  2429. '
  2430. ' ****    - CHANGE MESSAGE READ SECURITY   ***
  2431. '
  2432. 4665 IF Q > 1 THEN _
  2433.         B$ = B$(2) : _
  2434.         GOTO 4666
  2435.      A$ = "Change min sec to read from" + _
  2436.           STR$(MESSAGE.SECURITY) + _
  2437.           " to"
  2438.      GOSUB 12995
  2439.      IF Q=0 THEN _
  2440.         RETURN
  2441. 4666 CALL CHECKINT (B$)
  2442.      IF EC <> 0 THEN _
  2443.         RETURN
  2444.      X = TESTED.INTEGER.VALUE
  2445.      SUBROUTINE.PARAMETER = 3
  2446.      CALL FILELOCK
  2447.      GET 1,CURRENT.HEADER
  2448.      MID$(MESSAGE.RECORD$,121,2) = MKI$(X)
  2449.      PUT 1,CURRENT.HEADER
  2450.      SUBROUTINE.PARAMETER = 4
  2451.      CALL FILELOCK
  2452.      CALL QTPUT1 ("Security changed to" + STR$(X))
  2453.      RETURN
  2454. '
  2455. ' ****  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)   ***
  2456. '
  2457. 4700 IF NOT SYSOP.AVAILABLE THEN _
  2458.         A$ = "Sorry, " + _
  2459.              SYSOP.FIRST.NAME$ + _
  2460.              " not available to answer page" : _
  2461.         GOSUB 12979 : _
  2462.         GOTO 4755
  2463. 4705 CALL QTPUT1 ("Chat. Remote Conversation")
  2464.      JJ = VAL(MID$(TIME$,1,2))*100 + VAL(MID$(TIME$,4,2))
  2465.      IF (JJ > START.OFFICE.HOURS AND JJ < END.OFFICE.HOURS) OR SYSOP.ANNOY THEN _
  2466.         GOTO 4710
  2467. 4708 A$ = "SYSOP in from" + _
  2468.           STR$(START.OFFICE.HOURS) + _
  2469.           " to" + _
  2470.           STR$(END.OFFICE.HOURS) + ","
  2471.      GOSUB 12979
  2472.      GOTO 4755
  2473. 4710 A$ = "Page " + _
  2474.           SYSOP.FIRST.NAME$ + _
  2475.           " (Y/[N])"                                                 ' KP061905
  2476.      CALL SKIPLINE (1)
  2477.      GOSUB 12999
  2478.      IF NOT YES THEN _                                               ' KP061905
  2479.         RETURN
  2480.      PAGE.COUNT = 0
  2481.      A$ = "Paging " + _
  2482.           SYSOP.FIRST.NAME$ + _
  2483.           " now"
  2484.      GOSUB 12978
  2485.      CALL SETABORT (PAGE.TIME.MAX!,30)
  2486. 4730 CALL DELAYIT (1)
  2487. 4735 PAGE.COUNT = PAGE.COUNT + 1
  2488.      IF INKEY$ = ESCAPE$ THEN _
  2489.         GOTO 4765
  2490. 4740 IF PAGE.COUNT MOD 2 THEN _
  2491.         A$ = PAGING.PRINTER.SUPPORT$ + _
  2492.              BELL.RINGER$ : _
  2493.         IF LEN(PAGING.PRINTER.SUPPORT$) = 3 THEN _
  2494.            CALL PRINTIT (CHR$(7)) : _
  2495.            IF EC <> 0 THEN _
  2496.               EL = 4740 : _
  2497.               GOTO 13000
  2498. 4745 GOSUB 12978
  2499.      CALL CHECKTIM (PAGE.TIME.MAX!)
  2500.      ON SUBROUTINE.PARAMETER GOTO 4730,4747
  2501. 4747 GOSUB 12979
  2502. 4750 CALL QTPUT1 (SYSOP.FIRST.NAME$ + " not responding")
  2503. 4755 CALL QTPUT1 ("Try a msg or comment")
  2504.      PAGE.STATUS$ = "Paged!"
  2505.      CALL UPDTCALR ("Operator paged " + LEFT$(TIME$,5),2)
  2506.      RETURN
  2507. 4765 CALL UPDTCALR ("Paged & chatted with Sysop",1)
  2508.      CALL QTPUT1 ("SYSOP in!  " + _
  2509.           FIRST.NAME$ + _
  2510.           ", this is " + _
  2511.           SYSOP.FIRST.NAME$ + _
  2512.           " go ahead!")
  2513.      PAGE.STATUS$ = ""
  2514. 4770 CALL SYSOPCHAT
  2515.      IF SUBROUTINE.PARAMETER < 0 THEN _
  2516.         GOTO 202
  2517.      RETURN
  2518. '
  2519. ' ****  S - COMMAND FROM UTILITY MENU (STATISTICS)  ***
  2520. '
  2521. 4850 GOSUB 1893
  2522.      CALL QTPUT1 ("RBBS-PC " + VERSION.ID$ + " Node " + NODE.ID$)
  2523.      A$ = ""
  2524.      IF NOT CONFERENCE.MODE THEN _
  2525.         A$ = "Caller # " + _
  2526.              STR$(CALLS.TODATE!) + _
  2527.              "  "
  2528. 4855 A$ = A$ + _
  2529.           "# active msgs:" + _
  2530.           STR$(ACTIVE.MESSAGES)
  2531.      A$ = A$ + _
  2532.           "  Next msg #" + _
  2533.           STR$(HIGH.MESSAGE.NUMBER + 1)
  2534.      IF LAST.MESSAGE.READ > 0 THEN _
  2535.         A$ = A$ + _
  2536.              "  Last msg read:" + _
  2537.              STR$(LAST.MESSAGE.READ)
  2538. 4857 GOSUB 12976
  2539.      IF (NOT SYSOP) AND (USER.SECURITY.LEVEL < SEC.KILL.ANY) THEN _
  2540.         RETURN
  2541.      USER.WORK = (HIGHEST.USER.RECORD * .95) + 1
  2542.      IF MESSAGES.CAN.GROW THEN _
  2543.         Y$ = " open" _
  2544.      ELSE Y$ = STR$(HIGHEST.MESSAGE.RECORD + 1 - NODES.IN.SYSTEM - NEXT.MESSAGE.RECORD)
  2545.      A$ = "USERS: used" + _
  2546.           STR$(CURRENT.USER.COUNT - 1) + _
  2547.           " avl" + _
  2548.           STR$(USER.WORK - CURRENT.USER.COUNT) + _
  2549.           "  MSGS: used" + _
  2550.           STR$(ACTIVE.MESSAGES) + _
  2551.           " avl" + _
  2552.           STR$(MAXIMUM.MESSAGES - ACTIVE.MESSAGES) + _
  2553.           "  MSG REC: used" + _
  2554.           STR$(NEXT.MESSAGE.RECORD - 1) + _
  2555.           " avl" + Y$
  2556.      GOSUB 12976
  2557.      Z$ = UPLOAD.DRIVE.FILE$
  2558.      CALL FINDFREE
  2559.      CALL QTPUT1 ("Upload disk has" + FREE.SPACE$)
  2560.      RETURN
  2561. 4900 IF (NOT LOCAL.USER) OR (NOT SYSOP) THEN _
  2562.         CALL UPDTCALR ("Entered " + GRN$,1)
  2563.      CALL QTPUT1 ("Welcome to " + GRN$)
  2564. 4905 CALL BUFFILE (FILE.NAME$,X)
  2565. 4910 GOSUB 12986
  2566.      GOSUB 5344
  2567.      IF LOF(1) = 0 THEN _
  2568.         DF$ = ACTIVE.MESSAGE.FILE$ : _
  2569.         CLOSE 1 : _
  2570.         KILL ACTIVE.MESSAGE.FILE$ : _
  2571.         GOSUB 12987 : _
  2572.         RETURN 13600
  2573.      GOSUB 23000
  2574.      RETURN
  2575. '
  2576. ' ****  P - COMMAND FROM UTILITY MENU (PASSWORD CHANGE)  ***
  2577. '
  2578. 5110 CALL NEWPASWRD ("Enter new password" + PRESS.ENTER$,TRUE)
  2579.      IF SUBROUTINE.PARAMETER < 0 THEN _
  2580.         GOTO 202
  2581.      IF Q = 0 THEN _
  2582.         RETURN
  2583. 5120 A$ = "Reenter new password"
  2584.      GOSUB 45010
  2585.      IF Q = 0 THEN _
  2586.         RETURN
  2587.      CALL ALLCAPS (B$)
  2588.      IF Z$ <> B$ THEN _
  2589.         A$ = "Passwords don't match!" : _
  2590.         GOSUB 12979 : _
  2591.         RETURN
  2592. 5125 IF MAXIMUM.PASSWORD.CHANGES AND _
  2593.         CHANGES.THIS.SESSION > _
  2594.         MAXIMUM.PASSWORD.CHANGES AND _
  2595.         NOT SYSOP THEN _
  2596.             A$ = "No changes permitted" : _
  2597.             GOSUB 12975 : _
  2598.             RETURN _
  2599.      ELSE PASSWORD.CHANGE.ALLOWED = TRUE : _
  2600.           GOSUB 5140 : _
  2601.           IF NOT FOUND THEN _
  2602.              GOTO 5129 _
  2603.           ELSE A$ = "Temporary change" : _
  2604.                GOSUB 12975 : _
  2605.                PASSWORD$ = TEMP.PASSWORD$ : _
  2606.                SECONDS.PER.SESSION! = TEMP.TIME.ALLOWED * 60 : _
  2607.                USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL : _
  2608.                GOSUB 41070 : _
  2609.                SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL) : _
  2610.                CALL CALLOPT : _
  2611.                CALL XFERTYPE (2,TRUE)
  2612.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2613.         B$(1) = "********"
  2614. 5126 CALL UPDTCALR ("Used temp password " + B$,2)
  2615.      RETURN
  2616. 5129 IF ORIG.USER.FILE$ <> ACTIVE.USER.FILE$ THEN _
  2617.         CALL QTPUT1 ("Password Change only in Logon User File") : _
  2618.         RETURN
  2619.      GOSUB 12989
  2620.      CALL OPENUSER (HIGHEST.USER.RECORD)
  2621.      GOSUB 9450
  2622. 5130 IF USER.FILE.INDEX < 1 OR _
  2623.         USER.FILE.INDEX > 32767 THEN _
  2624.         GOTO 5160
  2625.      GET 5,USER.FILE.INDEX
  2626.      CALL ALLCAPS (B$)
  2627.      LSET PASSWORD$ = B$
  2628.      GOSUB 9440
  2629.      GOSUB 12991
  2630.      A$ = "Password changed"
  2631.      STOP.INTERRUPTS = TRUE
  2632.      GOSUB 12975
  2633.      IF MAXIMUM.PASSWORD.CHANGES THEN _
  2634.         CHANGES.THIS.SESSION = CHANGES.THIS.SESSION + 1
  2635. 5131 CALL UPDTCALR ("New Password " + B$(1),2)
  2636.      RETURN
  2637. '
  2638. ' ****  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS  ***
  2639. '
  2640. 5135 Z$ = ""
  2641.      Z = 0
  2642.      GOSUB 5140
  2643.      IF NOT FOUND THEN _                                             ' KG072604
  2644.         TEMP.TIME.ALLOWED = MINUTES.PER.SESSION.DEF! : _             ' KG072604
  2645.         TEMP.MAX.PER.DAY = MAX.PER.DAY.DEF _                         ' KG072604
  2646.      ELSE TIME.LOCK.SET = TEMP.TIME.LOCK : _                         ' KG072604
  2647.           IF TEMP.REG.PERIOD > 0 THEN _
  2648.              DAYS.IN.REGISTRATION.PERIOD = TEMP.REG.PERIOD
  2649.      MINUTES.PER.SESSION! = TEMP.TIME.ALLOWED                        ' KG072604
  2650.      MAX.PER.DAY = -(MAX.PER.DAY * (TEMP.MAX.PER.DAY <= 0)) - _      ' KG072604
  2651.                     (TEMP.MAX.PER.DAY * (TEMP.MAX.PER.DAY > 0))      ' KG072604
  2652.      IF LIMIT.MINUTES.PER.SESSION! THEN _
  2653.         IF MINUTES.PER.SESSION! > LIMIT.MINUTES.PER.SESSION! THEN _
  2654.            MINUTES.PER.SESSION! = LIMIT.MINUTES.PER.SESSION!
  2655.      GOSUB 825                                                       ' KG072604
  2656.      RETURN
  2657. 5140 FOUND = FALSE
  2658.      CALL OPENWORK (2,PASSWORDS.FILE$)
  2659.      IF EC = 53 THEN _
  2660.         CALL UPDTCALR ("Missing file " + PASSWORDS.FILE$,2) : _
  2661.         IF Z = 1 THEN _
  2662.            CALL ALLCAPS (B$(1)) : _
  2663.            Z$ = B$(1) : _
  2664.            GOTO 5160 _
  2665.         ELSE GOTO 5160
  2666.      Z$ = Z$ + _
  2667.           SPACE$(15 - LEN(Z$))
  2668. 5150 IF EOF(2) THEN _
  2669.         GOTO 5160
  2670. 5151 CALL GETPASWD
  2671.      IF EC <> 0 THEN _
  2672.         EL = 5151 : _
  2673.         GOTO 13000
  2674.      IF LEN(TEMP.PASSWORD$) > 15 THEN _
  2675.         GOTO 5150
  2676.      TEMP.PASSWORD$ = TEMP.PASSWORD$ + _
  2677.                       SPACE$(15 - LEN(TEMP.PASSWORD$))
  2678.      IF Z$ <> TEMP.PASSWORD$ THEN _
  2679.         GOTO 5150
  2680.      IF PASSWORD.CHANGE.ALLOWED AND _
  2681.         USER.SECURITY.LEVEL >= MINIMUM.SECURITY.FOR.TEMP.PASSWORD THEN _
  2682.         GOTO 5155
  2683.      IF USER.SECURITY.LEVEL <> TEMP.SECURITY.LEVEL THEN _
  2684.         GOTO 5150
  2685.      IF START.TIME = 0 THEN _
  2686.         GOTO 5155
  2687.      WORK.TIME$ = TIME$
  2688.      TEST.TIME = VAL(LEFT$(WORK.TIME$,2) + MID$(WORK.TIME$,4,2))
  2689.      IF TEST.TIME => START.TIME AND TEST.TIME <= END.TIME THEN _
  2690.         GOTO 5155
  2691.      IF END.TIME < START.TIME THEN _
  2692.         IF TEST.TIME => START.TIME OR TEST.TIME <= END.TIME THEN _
  2693.            GOTO 5155
  2694.      GOTO 5150
  2695. 5155 FOUND = TRUE
  2696. 5160 EC = 0
  2697.      RETURN
  2698. 5200 CALL PAGELEN
  2699.      RETURN
  2700. '
  2701. ' ****  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)  ***
  2702. '
  2703. 5300 A1$ = CONFERENCE.MENU$
  2704.      CALL BRKFNAME (ACTIVE.MESSAGE.FILE$,MSG.DRVPATH$,X$,Y$,TRUE)
  2705.      CALL TALK (12,A$)
  2706. 5301 CALL SUBMENU ("What conference, L)ist, M)ain ([ENTER] quits)",_
  2707.          A1$,MSG.DRVPATH$,_
  2708.          "M.DEF","M",USER.GRAPHIC.DEFAULT$,TRUE,FALSE,FALSE,"C.DEF")
  2709.      IF Q = 0 THEN _
  2710.         RETURN
  2711.      IF SUBROUTINE.PARAMETER = -1 THEN _
  2712.         RETURN 10595
  2713. 5323 IF Z$ = "M" OR Z$ = "MAIN" THEN _
  2714.         IF GRN$ = "MAIN" THEN _
  2715.            RETURN _
  2716.         ELSE GOTO 5350
  2717.      ANS.INDEX = 0
  2718.      IF NOT OK THEN _
  2719.         GOTO 5300
  2720.      Q = 0
  2721.      CLOSE 2
  2722. '
  2723. ' ****  UPDATE PREVIOUS MESSAGE BASE CHECKPOINT RECORD  ***
  2724. '
  2725. 5324 PREV.GRN$ = GRN$
  2726.      GRN$ = Z$
  2727.      GRN.NAME$ = GRN$
  2728.      GRN.SAVE$ = GRN$
  2729.      ' GOSUB 5342                                                    ' KG061501
  2730.      PREV.MESSAGE$ = ACTIVE.MESSAGE.FILE$
  2731.      ACTIVE.MESSAGE.FILE$ = FILE.NAME$
  2732.      GOSUB 5343
  2733. '
  2734. ' ****  UPDATE PREVIOUS USER RECORD  ***
  2735. '
  2736. 5325 GOSUB 5380
  2737. '
  2738. ' *****  CHECK WHETHER HAVE SUBBOARD (I.E. CONFIG.DEF EXISTS)  ****
  2739. '
  2740. 5327 USER.RECORD.HOLD$ = USER.RECORD$
  2741.      CONFERENCE.MODE.SAVE = CONFERENCE.MODE
  2742.      CONFERENCE.MODE = TRUE
  2743.      PREV.USER$ = ACTIVE.USER.FILE$
  2744.      PREV.INDEX = USER.FILE.INDEX
  2745.      PREV.MAIN.USER$ = MAIN.USER.FILE$
  2746.      PREV.USL = USER.SECURITY.LEVEL
  2747.      PREV.DEF$ = CURRENT.DEF$
  2748. 5328 X$ = GRN$ + _
  2749.           "C.DEF"
  2750.      CALL FINDIT (X$)
  2751.      SUB.BOARD = OK
  2752.      IF NOT SUB.BOARD THEN _
  2753.         CALL BRKFNAME (MAIN.MESSAGE.FILE$,MSG.DRVPATH$,DF$,Y$,TRUE) : _
  2754.         X$ = MSG.DRVPATH$ + X$ : _
  2755.         CALL FINDIT (X$) : _
  2756.         SUB.BOARD = OK
  2757.      IF SUB.BOARD THEN _
  2758.         IF LEN(GRN$) = 7 THEN _
  2759.            IF LEFT$(GRN$,4) = "RBBS" AND RIGHT$(GRN$,2) = "PC" THEN _
  2760.               SUB.BOARD = FALSE
  2761.      IF NOT SUB.BOARD THEN _
  2762.         CALL BRKFNAME (ACTIVE.USER.FILE$,USR.DRVPATH$,DF$,Y$,TRUE) : _
  2763.         X$ = USR.DRVPATH$ + _
  2764.              GRN$ + _
  2765.              "U.DEF" : _
  2766.         FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  2767.                      GRN$ + _
  2768.                      "W.DEF" _
  2769.         ELSE CALL READDEF (X$) : _
  2770.              IF EC > 0 THEN _
  2771.                 CALL UPDTCALR ("Error"+STR$(EC)+" reading config file "+X$,2) : _
  2772.                 EC = 0 : _
  2773.                 IN.CONF.MENU = FALSE : _
  2774.                 A$ = "error reading subboard" : _
  2775.                 GOTO 5341 _
  2776.              ELSE X$ = MAIN.USER.FILE$ : _
  2777.                   FILE.NAME$ = "" : _
  2778.                   CALL FINDIT (MAIN.MESSAGE.FILE$) : _
  2779.                   IF NOT OK THEN _
  2780.                      A$ = "msg file missing for" : _
  2781.                      IN.CONF.MENU = FALSE : _
  2782.                      GOTO 5341 _
  2783.                   ELSE ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  2784.                        GOSUB 5343
  2785.      UPDATE.DATE = TRUE
  2786.      CALL FINDIT (X$)
  2787.      IF OK THEN _
  2788.         GOTO 5330
  2789. '
  2790. ' *****  NO USER FILE - A PUBLIC CONFERENCE   ****
  2791. '
  2792.      MAIN.USER.FILE$ = PREV.MAIN.USER$
  2793.      IF (USER.SECURITY.LEVEL < AUTO.ADD.SECURITY) THEN _
  2794.         GOTO 5340
  2795.      GOTO 5345
  2796.      'X$ = MAIN.USER.FILE$
  2797.      'SYSOP.PASSWORD.1$ = ""
  2798.      'SYSOP.PASSWORD.2$ = ""
  2799. '
  2800. ' ****  CHECK CONFERENCE USER'S FILE  ***
  2801. '
  2802. 5330 ACTIVE.USER.FILE$ = X$
  2803.      IF MAIN.USER.FILE.INDEX < 1 THEN _
  2804.         FOUND = FALSE : _
  2805.         USER.FILE.INDEX = 0 : _
  2806.         GOTO 5335
  2807.      CALL WORDINFILE (CONFERENCE.MENU$,GRN$,IN.CONF.MENU)
  2808.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2809.         TEMP.HASH.VALUE$ = ORIG.USER.NAME$
  2810.      GOSUB 12598
  2811.      GOSUB 12984
  2812. 5335 IF FOUND THEN _
  2813.         ADD.TO.CONF = FALSE : _
  2814.         GOSUB 9500 : _
  2815.         MAIN.USER.FILE.INDEX = -(SUB.BOARD * USER.FILE.INDEX)_
  2816.                                -((NOT SUB.BOARD) * MAIN.USER.FILE.INDEX) : _
  2817.         TEMP = -(SUB.BOARD * MINIMUM.LOGON.SECURITY) _
  2818.                -((NOT SUB.BOARD) * AUTO.ADD.SECURITY) : _
  2819.         I = (USER.SECURITY.LEVEL < ORIG.MIN.SEC) : _
  2820.         J = (USER.SECURITY.LEVEL < TEMP) : _
  2821.         K = (I AND J) : _
  2822.         IF K THEN _
  2823.            A$ = "you have been locked out of" : _
  2824.            GOTO 5341 _
  2825.         ELSE GOSUB 5375 : _
  2826.              GOTO 5345
  2827. '
  2828. ' **** USER NOT FOUND.  AUTO-ADD TO SUBBOARD IF SUFFICIENT SECURITY ***
  2829. '
  2830.      IF SUB.BOARD THEN _
  2831.         AUTO.ADD.SECURITY = MINIMUM.LOGON.SECURITY
  2832.      IF (USER.SECURITY.LEVEL >= AUTO.ADD.SECURITY) AND _
  2833.         (USER.FILE.INDEX > 0) AND (MAIN.USER.FILE.INDEX > 0) THEN _
  2834.         GOSUB 5365 : _
  2835.         IF NOT YES THEN _
  2836.            CALL QTPUT1 ("MEMBER privileges granted in " + GRN$) : _
  2837.            LSET USER.RECORD$ = USER.RECORD.HOLD$ : _
  2838.            MID$(USER.OPTIONS$,3,2) = MKI$(0) : _
  2839.            MID$(USER.OPTIONS$,1,2) = MKI$(0) : _
  2840.            ACTIVE.USER.NAME$ = LEFT$(USER.RECORD.HOLD$,30) : _
  2841.            CALL TRIM (ACTIVE.USER.NAME$) : _
  2842.            TEMP = -(SUB.BOARD * ORIG.SECURITY) _
  2843.                   -((NOT SUB.BOARD) * USER.SECURITY.SAVE) : _
  2844.            GOSUB 5370 : _
  2845.            TEMP = -(A * SYSOP.SECURITY.LEVEL) - ((NOT A) * TEMP) : _
  2846.            LSET SECURITY.LEVEL$ = MKI$(TEMP) : _
  2847.            USER.SECURITY.LEVEL = TEMP : _
  2848.            GOSUB 12986 : _
  2849.            GOSUB 12630 : _
  2850.            UPDATE.DATE = TRUE : _
  2851.            FOUND = TRUE : _
  2852.            GOTO 5335 _
  2853.         ELSE JUST.BROWSING = TRUE
  2854.      IF USER.SECURITY.LEVEL >= AUTO.ADD.SECURITY THEN _
  2855.         CALL QTPUT1 ("GUEST privileges granted in " + GRN$) : _
  2856.         ACTIVE.USER.FILE$ = PREV.USER$ : _
  2857.         UPDATE.DATE = FALSE : _
  2858.         USER.FILE.INDEX = PREV.INDEX : _
  2859.         GOSUB 5382 : _
  2860.         ACTIVE.USER.FILE$ = "" : _                                   ' KG072702
  2861.         USER.FILE.INDEX = 0 : _                                      ' KG072702
  2862.         GOTO 5345
  2863.      ADD.TO.CONF = FALSE
  2864. 5340 IF IN.CONF.MENU THEN _
  2865.         A$ = "you are not in conference" _
  2866.      ELSE A$ = "no such option"
  2867. 5341 A$ = A$ + " " + GRN$
  2868. '
  2869. ' ****  CANNOT JOIN THE REQUESTED CONFERENCE.  THEREFORE, GO BACK  ***
  2870. '
  2871.      GOSUB 1397
  2872.      GRN$ = PREV.GRN$
  2873.      GRN.NAME$ = GRN$
  2874.      IF SUB.BOARD THEN _
  2875.         CALL READDEF (PREV.DEF$)
  2876.      ACTIVE.MESSAGE.FILE$ = PREV.MESSAGE$
  2877.      GOSUB 5343
  2878.      USER.FILE.INDEX = PREV.INDEX
  2879.      ACTIVE.USER.FILE$ = PREV.USER$
  2880.      GOSUB 5382
  2881.      CONFERENCE.MODE = CONFERENCE.MODE.SAVE
  2882.      GOSUB 12987
  2883.      ANS.INDEX = 0
  2884.      GOTO 5301                                                       ' KG061501
  2885. '
  2886. ' ****  RESTORE A MESSAGE BASE   ***
  2887. '
  2888. 5343 GOSUB 5344
  2889.      GOSUB 23000
  2890.      RETURN
  2891. '
  2892. ' *****  OPEN AND SETUP MESSAGE BASE  *****
  2893. '
  2894. 5344 CALL OPENMSG
  2895.      IF EC = 64 THEN _
  2896.         EC = 0 : _
  2897.         GOTO 5350
  2898.      FIELD 1, 128 AS MESSAGE.RECORD$
  2899.      RETURN
  2900. '
  2901. ' *****  SUCCESSFUL CONFERENCE JOIN  ****
  2902. '
  2903. 5345 GRN$ = GRN$ + " " + MID$("ConferenceSubboard",1-10*SUB.BOARD,10)
  2904.      IF GLOBAL.SYSOP THEN _
  2905.         ACTIVE.USER.NAME$ = "SYSOP"
  2906. 5347 GOSUB 4900
  2907. 5348 GOSUB 12987
  2908.      GOSUB 12990
  2909.      IF SUB.BOARD THEN _
  2910.         HAS.DOORED = FALSE : _
  2911.         ACTIVE.FMS.DIRECTORY$ = "" : _
  2912.         RETURN 108
  2913.      GOSUB 827                                                       ' KG052101
  2914.      IF UPDATE.DATE THEN _
  2915.         BOARD.CHECK.DATE$ = LAST.DATE.TIME.ON$ : _
  2916.         LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  2917.                                   " " + _
  2918.                                   TIME.LOGGED.ON$ : _
  2919.         GOSUB 9440 : _
  2920.         GOSUB 12991
  2921.      IF PREV.USL <> USER.SECURITY.LEVEL THEN _
  2922.         CALL CALLOPT
  2923.      RETURN 852
  2924. '
  2925. ' ****  JOIN M)AIN   ***
  2926. '
  2927. 5350 IF GRN$ <> "MAIN" THEN _
  2928.         CALL QTPUT1 ("Rejoining " + ORIG.MSG.NAME$)
  2929.      UPLOADS = GLOBAL.UPLOADS
  2930.      DOWNLOADS = GLOBAL.DOWNLOADS
  2931.      DL.TODAY! = GLOBAL.DL.TODAY!
  2932.      BYTES.TODAY! = GLOBAL.BYTES.TODAY!
  2933.      DLBYTES! = GLOBAL.DLBYTES!
  2934.      ULBYTES! = GLOBAL.ULBYTES!
  2935.      GRN$ = "MAIN"
  2936.      GRN.NAME$ = ORIG.MSG.NAME$
  2937.      TURBO.LOGON = TRUE
  2938.      Q = 0
  2939.      IN.CONF.MENU = TRUE
  2940.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2941.         ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  2942.      CONFIG.FILENAME$ = ORIG.CONFIG$
  2943.      CALL READDEF (CONFIG.FILENAME$)
  2944.      IF ORIG.MESSAGE.FILE$ <> ACTIVE.MESSAGE.FILE$ THEN _            ' KG061501
  2945.         ACTIVE.MESSAGE.FILE$ = ORIG.MESSAGE.FILE$ : _
  2946.         GOSUB 5343
  2947.      IF ORIG.USER.FILE$ <> ACTIVE.USER.FILE$ THEN _
  2948.         GOSUB 5380 : _
  2949.         ACTIVE.USER.FILE$ = ORIG.USER.FILE$ : _
  2950.         ACTIVE.USER.NAME$ = ORIG.USER.NAME$ : _                      ' KG052005
  2951.         GOSUB 12598 : _
  2952.         GOSUB 12990 : _
  2953.         IF FOUND THEN _
  2954.            GOSUB 9500 : _
  2955.            MAIN.USER.FILE.INDEX = USER.FILE.INDEX : _
  2956.            CALL CALLOPT : _
  2957.            CALL XFERTYPE (2,TRUE) _
  2958.         ELSE USER.FILE.INDEX = 0 : _
  2959.              MAIN.USER.FILE.INDEX = 0
  2960.      IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  2961.         CALL UPDTCALR ("Exited Conference",1)
  2962.      GOSUB 2350
  2963. 5360 CONFERENCE.MODE = FALSE
  2964.      SUB.BOARD = TRUE
  2965.      GOSUB 12987
  2966.      RETURN 108
  2967. 5365 IF ADD.TO.CONF THEN _
  2968.         ADD.TO.CONF = FALSE : _
  2969.         YES = FALSE : _
  2970.         RETURN
  2971.      TURBO.KEY = -TURBO.KEY.USER
  2972.      A$ = "Browse conference without permanently joining (Y,[N])"
  2973.      GOSUB 12995
  2974.      RETURN
  2975. 5370 A = (ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$)
  2976.      GLOBAL.SYSOP = (GLOBAL.SYSOP OR (A AND ORIG.CONFIG$ = CONFIG.FILENAME$))
  2977.      IF GLOBAL.SYSOP THEN _
  2978.         A = TRUE
  2979.      RETURN
  2980. 5375 IF ((USER.SECURITY.LEVEL < AUTO.UPGRADE.SEC) AND SUB.BOARD) OR _
  2981.         ((USER.SECURITY.LEVEL < ORIG.UPGRADE.SEC) AND NOT SUB.BOARD) THEN _
  2982.            IF USER.SECURITY.LEVEL <> ORIG.SECURITY THEN _
  2983.               USER.SECURITY.LEVEL = ORIG.SECURITY : _
  2984.               LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  2985.      RETURN
  2986. '
  2987. ' *****  UPDATE CURRENT USERS RECORD  ****
  2988. '
  2989. 5380 IF USER.FILE.INDEX < 1 THEN _
  2990.         RETURN
  2991.      IF ADJUSTED.SECURITY AND NOT SYSOP THEN _
  2992.         LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  2993.         USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  2994.      CALL UPDATEU (FALSE)
  2995.      RETURN
  2996. '
  2997. ' *****  RESTORE A USER RECORD  ****
  2998. '
  2999. 5382 IF USER.FILE.INDEX < 1 THEN _
  3000.         USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL : _
  3001.         RETURN
  3002.      CALL OPENUSER (HIGHEST.USER.RECORD)
  3003.      GET 5,USER.FILE.INDEX
  3004.      GOSUB 9500
  3005.      RETURN
  3006. '
  3007. ' *****  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)  ****
  3008. '
  3009. 5400 CALL SKIPLINE(2)
  3010.      CALL QTPUT1 ("Your PROFILE (Use Utilities to Reset)")
  3011. 5410 CALL TOGGLE(-9)
  3012.      GOSUB 43020
  3013.      FF = INSTR(DFLTXFER$,USER.TRANSFER.DEFAULT$)
  3014.      CALL TOGGLE(-5)
  3015.      GOSUB 42810
  3016.      CALL TOGGLE(-3)
  3017.      CALL TOGGLE(-6)
  3018.      CALL TOGGLE(-7)
  3019.      CALL TOGGLE(-10)
  3020.      CALL TOGGLE(-2)
  3021.      CALL TOGGLE(-4)
  3022.      CALL TOGGLE(-8)
  3023.      CALL TOGGLE(-1)
  3024.      IF RESTRICT.BY.DATE THEN _
  3025.         IF USER.SECURITY.LEVEL > EXPIRED.SECURITY THEN _
  3026.            CALL QTPUT1 ("Registration expires " + EXPIRATION.DATE$)
  3027.      RETURN
  3028. '
  3029. ' *****  B - COMMAND FROM UTILITY MENU (300 TO 450 BAUD CHANGE)  ****
  3030. '
  3031. 5500 CALL BAUD450
  3032.      IF LOCAL.USER OR NOT (SUBROUTINE.PARAMETER OR C = 20) THEN _
  3033.         RETURN
  3034. 5502 RETURN 10595  'Entry point when have double nested gosub
  3035. '
  3036. ' *****  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)  ****
  3037. '
  3038. 5800 CALL CONFMAIL (MAILCHECK.CONFIRM)
  3039.      CONFMAIL.JOIN = (HOME.CONFERENCE$ <> "")
  3040.      RETURN
  3041. '
  3042. ' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY
  3043. '
  3044. 8000 IF RET THEN _
  3045.         RETURN
  3046. 8020 IF MID$(MESSAGE.RECORD$,37,5) = "ALL  " THEN _
  3047.         MESSAGE.TO$ = "ALL" : _
  3048.         GOTO 8040
  3049. 8030 MESSAGE.TO$ = MID$(MESSAGE.RECORD$,37,22)
  3050.      CALL TRIM (MESSAGE.TO$)
  3051. 8040 IF LEN(MESSAGE.TO$) < 23 THEN _
  3052.         MESSAGE.TO$ = MESSAGE.TO$ + _
  3053.                       SPACE$(23 - LEN(MESSAGE.TO$))
  3054.      SUBJECT$ = MID$(MESSAGE.RECORD$,76,25)
  3055.      CALL TRIM (SUBJECT$)
  3056.      ORIG.SUBJECT$ = SUBJECT$
  3057.      IF PASSWORD.FAILED THEN _
  3058.         SUBJECT$ = SJ$
  3059. 8050 MESSAGE.FROM$ = MID$(MESSAGE.RECORD$,6,31)
  3060.      CALL TRIM (MESSAGE.FROM$)
  3061.      IF LEN(MESSAGE.FROM$) < 23 THEN _
  3062.         MESSAGE.FROM$ = MESSAGE.FROM$ + _
  3063.                         SPACE$(23 - LEN(MESSAGE.FROM$))
  3064.      IF USER.SECURITY.LEVEL >= SEC.CHANGE.MSG THEN _
  3065.         YY$ = "  Security:" + _
  3066.               STR$(MESSAGE.SECURITY) _
  3067.         ELSE YY$ = ""
  3068.      IF MID$(MESSAGE.RECORD$,101,1) = "!" THEN _
  3069.         MID$(MESSAGE.RECORD$,1,1) = "!"
  3070.      A$ = FG.1$ + "Msg #: " + _
  3071.           LEFT$(MESSAGE.RECORD$,5) + _
  3072.           + YY$
  3073.      YY$ = FG.4$ + "   Sent: " + _
  3074.           MID$(MESSAGE.RECORD$,68,8) + _
  3075.           " " + _
  3076.           MID$(MESSAGE.RECORD$,59,5)
  3077.      IF NOT RET THEN _
  3078.         IF READ.MESSAGES THEN _
  3079.            CALL QTPUT1 (A$): _
  3080.            X$ = MESSAGE.FROM$ : _
  3081.            CALL CHKCOLOR (X$,SEARCH.HEADER$,FG.2$) : _
  3082.            CALL QTPUT1 (FG.2$ + " From:  " + X$ + YY$) : _
  3083.            GOSUB 8076 : _
  3084.            X$ = MESSAGE.TO$ : _
  3085.            CALL CHKCOLOR (X$,SEARCH.HEADER$,FG.3$) : _
  3086.            CALL QTPUT1 (FG.3$ + "   To:  " + X$ + "  " + FG.2$ + YY$) : _
  3087.            CALL CHKCOLOR (SUBJECT$,SEARCH.HEADER$,FG.4$) : _
  3088.            A$ = FG.4$ + "   Re:  " + _
  3089.                 SUBJECT$ + EMPHASIZE.OFF$ _
  3090.         ELSE A$ = FG.1$ + LEFT$(MESSAGE.RECORD$,5) + _
  3091.                   " " + _
  3092.                   MID$(MESSAGE.RECORD$,68,5) + _
  3093.                   " " + _
  3094.                   + FG.2$ + LEFT$(MESSAGE.FROM$,18) + _
  3095.                   " -> " + _
  3096.                   + FG.3$ + LEFT$(MESSAGE.TO$,19) + _
  3097.                   " " + _
  3098.                   + FG.4$ + LEFT$(SUBJECT$,24) + EMPHASIZE.OFF$ : _
  3099.              CALL CHKCOLOR (A$,SEARCH.HEADER$,"") : _
  3100.              GOTO 8080
  3101.      IF QUICK.SCAN.MESSAGES OR _
  3102.         SCAN.MESSAGES THEN _
  3103.            GOTO 8080 _
  3104.      ELSE GOTO 8077
  3105. 8076 IF MID$(MESSAGE.RECORD$,123,6) = STRING$(6,0) OR _
  3106.         MID$(MESSAGE.RECORD$,123,6) = SPACE$(6) THEN _
  3107.            YY$ = " Rcvd: -NO-" : _
  3108.            RETURN
  3109.      YY$ = " Rcvd: " + _
  3110.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,123,1))),2) + _
  3111.            "-" + _
  3112.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,124,1))),2) + _
  3113.            "-" + _
  3114.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,125,1))),2) + _
  3115.            " " + _
  3116.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,126,1))),2) + _
  3117.            ":" + _
  3118.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,127,1))),2)
  3119.      FOR I = 8 TO 15
  3120.         IF MID$(YY$,I,1) = " " THEN _
  3121.            MID$(YY$,I,1) = "0"
  3122.      NEXT
  3123.      FOR I = 17 TO 21
  3124.         IF MID$(YY$,I,1) = " " THEN _
  3125.            MID$(YY$,I,1) = "0"
  3126.      NEXT
  3127.      RETURN
  3128. 8077 IF (NOT MSG.TO.CALLER) THEN _
  3129.         A = (MID$(MESSAGE.RECORD$,37,5) = "ALL  ") : _
  3130.         IF NOT A THEN _
  3131.            GOTO 8080
  3132.      IF MSG.FROM.CALLER THEN _
  3133.         GOTO 8080
  3134.      YY$ = DATE$
  3135.      WK$ = TIME$
  3136.      MID$(MESSAGE.RECORD$,123,6) = CHR$(VAL(MID$(YY$,1,2))) + _
  3137.                                    CHR$(VAL(MID$(YY$,4,2))) + _
  3138.                                    CHR$(VAL(MID$(YY$,9,2))) + _
  3139.                                    CHR$(VAL(MID$(WK$,1,2))) + _
  3140.                                    CHR$(VAL(MID$(WK$,4,2))) + _
  3141.                                    CHR$(VAL(MID$(WK$,7,2)))
  3142.      GOSUB 12986
  3143.      PUT 1,M(MESSAGE.DIM.INDEX,1)
  3144.      GOSUB 12987
  3145. 8080 GOSUB 12979
  3146.      A$ = ""
  3147.      RETURN
  3148. '
  3149. ' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY
  3150. '
  3151. 9000 IF NOT JUST.SEARCHING THEN _
  3152.         GOSUB 4656: _                                                ' KG060901
  3153.         CALL SKIPLINE (1) : _
  3154.         LINES.IN.MESSAGE = 1 : _
  3155.         ADIMX = 150 : _
  3156.         REDIM A$(ADIMX) : _
  3157.         REMAIN$ = "" : _
  3158.         IF NOT QUOTED.REPLY THEN _
  3159.            DONT.PRINT = FALSE
  3160.      FOR X = 2 TO VAL(MID$(MESSAGE.RECORD$,117,4))
  3161.         J = 1
  3162.         GET 1
  3163.         IF JUST.SEARCHING THEN _
  3164.            A$ = MESSAGE.RECORD$ : _
  3165.            CALL ALLCAPS (A$) : _
  3166.            HIGHLITE.POS = INSTR(A$,SEARCH.STRING$) : _
  3167.            IF HIGHLITE.POS > 0 THEN _
  3168.               HIGHLITE.REC = LOC(1) : _
  3169.               X = 9999 : _
  3170.               GOTO 9090 _
  3171.            ELSE GOTO 9090
  3172. 9050    B = INSTR(J,MESSAGE.RECORD$,CHR$(227))
  3173.         IF RET THEN _
  3174.            RETURN
  3175. 9060    C = B - J
  3176.         IF C < 0 THEN _
  3177.            C = 128
  3178. 9070    A$ = MID$(MESSAGE.RECORD$,J,C)
  3179.         IF HIGHLITE.REC = LOC(1) THEN _
  3180.            IF HIGHLITE.POS >= J AND HIGHLITE.POS < J+C THEN _
  3181.               HIGHLITE.REC = -1 : _
  3182.               CALL BRACKET (A$,HIGHLITE.POS-J+1,HIGHLITE.POS+LEN(SEARCH.STRING$)-J,EMPHASIZE.ON$,EMPHASIZE.OFF$)
  3183.         IF B = 0 THEN _
  3184.            REMAIN$ = A$ : _
  3185.            GOTO 9090 _
  3186.         ELSE A$ = REMAIN$ + A$ : _
  3187.              REMAIN$ = "" : _
  3188.              J = B + 1
  3189. 9085    IF LEFT$(A$,1) = START.OF.HEADER$ OR _
  3190.            LEFT$(A$,LEN(SCREEN.OUT.MSG$)) = SCREEN.OUT.MSG$ THEN _
  3191.            GOTO 9050
  3192.         A$(LINES.IN.MESSAGE) = A$
  3193.         LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  3194.         IF LINES.IN.MESSAGE > ADIMX THEN _
  3195.            LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1 : _
  3196.            CALL SKIPLINE (1) : _
  3197.            CALL QTPUT1 ("Message too long.  Truncated to " + STR$(ADIMX) + " lines!") : _
  3198.            A$ = "" : _
  3199.            RETURN
  3200.         IF DONT.PRINT = FALSE THEN _
  3201.            CALL QTPUT1 (A$) : _
  3202.            IF RET THEN _
  3203.               A$ = "" : _
  3204.               RETURN
  3205.            CALL ASKMORE ("",TRUE,TRUE,MESSAGES.SELECTED.INDEX,FALSE)
  3206.            IF NO THEN _
  3207.               DONT.PRINT = TRUE
  3208.         GOTO 9050
  3209. 9090 NEXT
  3210.      IF DONT.PRINT = TRUE THEN _
  3211.         GOTO 5160
  3212.      IF JUST.SEARCHING AND HIGHLITE.POS > 0 THEN _
  3213.         JUST.SEARCHING = FALSE : _
  3214.         GET 1,M(MESSAGE.DIM.INDEX,1) : _
  3215.         GOSUB 8000 : _
  3216.         GOTO 9000
  3217.      A$ = ""
  3218.      RETURN
  3219. '
  3220. ' *  C - COMMAND FROM UTILITY MENU (CLOCK - TIME ON SYSTEM)
  3221. '
  3222. 9100 CALL RPTTIME
  3223.      RETURN
  3224. '
  3225. ' * WRITE A RECORD TO THE RBBS-PC "USER" FILE
  3226. '
  3227. 9440 IF USER.FILE.INDEX > 0 AND USER.FILE.INDEX < 32768 THEN _
  3228.         PUT 5,USER.FILE.INDEX
  3229.      RETURN
  3230. '
  3231. ' * DEFINE USER FILE RECORD VARIABLES TO COMPENSATE FOR THE BUG IN QUICKBASIC
  3232. ' * THAT REQUIRES A FIELD STATMENT TO BE EXECUTED WITHIN EACH SEPARATELY
  3233. ' * COMPILED PROGRAM -- EVEN THOUGH A FIELD STATEMENT WAS EXECUTED WHEN THE
  3234. ' * FILE WAS OPENED IN ANOTHER SEPERATELY COMPILED SUBROUTINE
  3235. '
  3236. 9450 IF LOF(5) < 1 THEN _
  3237.         DF$ = ACTIVE.USER.FILE$ : _
  3238.         RETURN 13600
  3239.      FIELD 5,31 AS USER.NAME$, _
  3240.              15 AS PASSWORD$, _
  3241.               2 AS SECURITY.LEVEL$, _
  3242.              14 AS USER.OPTIONS$,  _
  3243.              24 AS CITY.STATE$, _
  3244.               3 AS MACHINE.TYPE$, _
  3245.               4 AS TODAY.DL$, _
  3246.               4 AS TODAY.BYTES$, _
  3247.               4 AS DL.BYTES$, _
  3248.               4 AS UL.BYTES$, _
  3249.              14 AS LAST.DATE.TIME.ON$, _
  3250.               3 AS LIST.NEW.DATE$, _
  3251.               2 AS USER.DOWNLOADS$, _
  3252.               2 AS USER.UPLOADS$, _
  3253.               2 AS ELAPSED.TIME$
  3254.      FIELD 5,128 AS USER.RECORD$
  3255.      RETURN
  3256. '
  3257. ' * GET USER DEFAULTS
  3258. '
  3259. 9500 GOSUB 9450
  3260.      GOSUB 5370
  3261.      IF A THEN _
  3262.         USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL _
  3263.      ELSE USER.SECURITY.LEVEL = CVI(SECURITY.LEVEL$)
  3264.      LAST.MESSAGE.READ = CVI(MID$(USER.OPTIONS$,3,2))
  3265.      USER.TRANSFER.DEFAULT$ = MID$(USER.OPTIONS$,5,1)
  3266.      IF USER.TRANSFER.DEFAULT$ = " " THEN _
  3267.         USER.TRANSFER.DEFAULT$ = "N"
  3268.      CALL XFERTYPE (2,TRUE)
  3269.      X = ASC(MID$(USER.OPTIONS$,6,1))
  3270.      GR = (X MOD 3)
  3271.      BOLD.TEXT$ = CHR$(48 - (X > 50))
  3272.      USER.TEXT.COLOR = (X - GR)/3 + 21
  3273.      IF USER.TEXT.COLOR > 37 THEN _
  3274.         USER.TEXT.COLOR = USER.TEXT.COLOR - 7
  3275.      IF EMPHASIZE.OFF$ <> "" THEN _
  3276.         CALL QTPUT (COLOR.RESET$,0)
  3277.      IF EMPHASIZE.ON.DEF$ <> "" THEN _
  3278.         EMPHASIZE.OFF$ = ESCAPE$ + "[" + BOLD.TEXT$ + ";40;" + MID$(STR$(USER.TEXT.COLOR),2) + "m" _
  3279.      ELSE EMPHASIZE.OFF$ = ""
  3280.      IF GR = 1 AND NOT EIGHT.BIT THEN _
  3281.         GR = 0
  3282.      CALL SETUGD (GR, USER.GRAPHIC.DEFAULT$)
  3283.      RIGHT.MARGIN = CVI(MID$(USER.OPTIONS$,7,2))
  3284.      IF RIGHT.MARGIN > 72 THEN _
  3285.         RIGHT.MARGIN = 72
  3286.      CI$ = CITY.STATE$
  3287.      CALL TRIM (CI$)
  3288. 9510 USER.OPTIONS = CVI(MID$(USER.OPTIONS$,9,2))
  3289.      PROMPT.BELL = (USER.OPTIONS AND 1) > 0
  3290.      EXPERT.USER = (USER.OPTIONS AND 2) > 0
  3291.      CALL SETEXPERT
  3292.      NULLS = (USER.OPTIONS AND 4) > 0
  3293.      UPPER.CASE = (USER.OPTIONS AND 8) > 0
  3294.      LINE.FEEDS = (USER.OPTIONS AND 16) > 0
  3295.      CHECK.BULLETIN.LOGON = (USER.OPTIONS AND 32) > 0
  3296.      SKIP.FILES.LOGON = (USER.OPTIONS AND 64) > 0
  3297.      AUTODOWNLOAD.DESIRED = (USER.OPTIONS AND 128) > 0
  3298.      REQ.QUES.ANSWERED = (USER.OPTIONS AND 256) > 0
  3299.      MAIL.WAITING = (USER.OPTIONS AND 512) > 0
  3300.      X = (USER.OPTIONS AND 1024 ) > 0
  3301.      CALL SETHILITE (NOT X)
  3302.      IF NOT HIGHLIGHT.OFF THEN _
  3303.         CALL QTPUT (EMPHASIZE.OFF$,0)
  3304.      TURBO.KEY.USER = (USER.OPTIONS AND 2048) > 0
  3305.      TURBO.KEY = FALSE
  3306.      GOSUB 11480
  3307.      PAGE.LENGTH = ASC(MID$(USER.OPTIONS$,13,1))
  3308.      IF SUB.BOARD THEN _
  3309.         GOTO 9520
  3310.      X$ = ECHOER$
  3311.      ECHOER$ = MID$(USER.OPTIONS$,14,1)
  3312.      IF INSTR("ICR",ECHOER$) = 0 THEN _
  3313.         ECHOER$ = "R"
  3314.      IF X$ <> ECHOER$ THEN _
  3315.         GOSUB 9525
  3316.      CALL SETECHO (ECHOER$)
  3317. 9520 NUL$ = MID$(STRING$(5,0),1, - 5 * NULLS)
  3318.      CALL SETCRLF
  3319.      USE.TPUT = (UPPER.CASE OR XON.XOFF)
  3320.      PASSWORD.SAVE$ = PASSWORD$
  3321.      RETURN
  3322. 9525 IF ECHOER$ = "R" THEN _
  3323.         CALL QTPUT1 ("RBBS now echoing what you type") _
  3324.      ELSE IF ECHOER$ = "C" THEN _
  3325.              CALL QTPUT1 ("Please set your communications package to echo") _
  3326.           ELSE CALL QTPUT1 ("Intermediate host now echoing what you type")
  3327.      RETURN
  3328. '
  3329. ' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)
  3330. '
  3331. 9700 RETURN.ON$ = "N"
  3332.      A1$ = BULLETIN.MENU$
  3333. 9701 CALL SUBMENU ("Read what bulletin(s), L)ist, N)ew ([ENTER] = none)",_
  3334.                    A1$, BULLETIN.PREFIX$,"",RETURN.ON$,_
  3335.                    USER.GRAPHIC.DEFAULT$,FALSE,FALSE,FALSE,"")
  3336.      IF Q = 0 THEN _
  3337.         RETURN
  3338.      CALL CHKCARRIER                                                 ' KG061203
  3339.      IF SUBROUTINE.PARAMETER = -1 THEN _
  3340.         RETURN 10595
  3341.      IF Z$ = "N" THEN _
  3342.         GOTO 9760
  3343.      STOP.INTERRUPTS = FALSE
  3344.      CALL BUFFILE (FILE.NAME$,ANS.INDEX)
  3345.      CALL UPDTCALR ("Read bulletin " + FILE.NAME$,1)
  3346. 9703 ANS.INDEX = ANS.INDEX + 1
  3347.      IF ANS.INDEX > LAST.INDEX THEN _
  3348.         ANS.INDEX = 0 : _                                            ' KG061203
  3349.         CALL CARRIER : _                                             ' KG061203
  3350.         IF SUBROUTINE.PARAMETER = -1 THEN _                          ' KG061203
  3351.            RETURN 10595                                              ' KG061203
  3352.      GOTO 9701
  3353. '
  3354. ' *  CHECK AND REVIEW NEW BULLETINS SINCE LAST LOGON
  3355. '
  3356. 9750 CALL CHKNEWBUL (BOARD.CHECK.DATE$,NUM.NEW.BULLETS,NEW.BULLETS$)
  3357.      CALL SKIPLINE (1)
  3358.      A$ = STR$(NUM.NEW.BULLETS) + _
  3359.           " NEW BULLETIN(S) since last call" + _
  3360.           NEW.BULLETS$
  3361.      GOSUB 12979
  3362.      RETURN
  3363. 9760 ' ****  [entry when want review plus chance to read] *********
  3364.      GOSUB 9750
  3365.      IF NUM.NEW.BULLETS > 0 THEN _
  3366.         LAST.INDEX = Q : _
  3367.         A$ = "READ ALL new bulletins ([Y],N)" : _
  3368.         GOSUB 12999 : _
  3369.         IF NOT NO THEN _
  3370.            ANS.INDEX = 2: _
  3371.            GOTO 9700
  3372.      IF ANS.INDEX < 1 THEN _
  3373.         RETURN _
  3374.      ELSE ANS.INDEX = 0 : _
  3375.           GOTO 9701
  3376. '
  3377. ' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)
  3378. '
  3379. 9800 CALL WHOSON (NODES.IN.SYSTEM)
  3380.      GOSUB 5344
  3381.      RETURN
  3382. '
  3383. ' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)
  3384. '
  3385. 10070 CALL MUZAK (7)
  3386.       FILE.NAME$ = COMMENTS.FILE$
  3387.       IF NOT STOP.INTERRUPTS THEN _
  3388.          A$ = "* Ctrl-K(^K) / ^X aborts. ^S suspends, ^Q resumes *" : _
  3389.          GOSUB 12976
  3390.       GOSUB 20150
  3391.       RETURN
  3392. '
  3393. ' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)
  3394. ' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)
  3395. '
  3396. 10090 CALL MUZAK (6)
  3397.       A$ = "List - U)sers, R)ecent callers"
  3398.       CALL SKIPLINE (1)
  3399.       GOSUB 12999
  3400.       IF Q = 0 THEN _
  3401.          RETURN
  3402.       CALL ALLCAPS (B$(1))
  3403.       ON INSTR("UR",B$(1)) + 1 GOTO 10090,10096,10093
  3404. 10093 CALL DISPCALL
  3405.       RETURN
  3406. 10096 USER.RECORD.HOLD$ = USER.RECORD$
  3407.       GOSUB 12700
  3408.       CALL OPENUSER (HIGHEST.USER.RECORD)
  3409.       GOSUB 9450
  3410.       STOP.INTERRUPTS = FALSE
  3411.       NON.STOP = (PAGE.LENGTH < 1)
  3412.       I = 1
  3413.       Z$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  3414. 10097 IF I > HIGHEST.USER.RECORD OR RET THEN _
  3415.          GOTO 10099
  3416.       GET 5,I
  3417.       X$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  3418.       IF ASC(X$)=0 OR LEFT$(X$,3)="   " OR LEFT$(PASSWORD$,3)="   " THEN _
  3419.          GOTO 10098
  3420.       IF INSTR(X$,Z$) > 0 OR SYSOP.SECURITY.LEVEL <= CVI(MID$(USER.RECORD$,47,2)) THEN _
  3421.          IF NOT SYSOP THEN _
  3422.             GOTO 10098
  3423.       CALL ASKMORE ("",TRUE,TRUE,XX,FALSE)
  3424.       IF NO OR SUBROUTINE.PARAMETER = -1 THEN _
  3425.          GOTO 10099
  3426.       A$ = LEFT$(X$,36) + CITY.STATE$ + LAST.DATE.TIME.ON$
  3427.       GOSUB 12979
  3428. 10098 I = I + 1
  3429.       GOTO 10097
  3430. 10099 A$ = ""
  3431.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  3432.       STOP.INTERRUPTS = TRUE
  3433.       RETURN
  3434. '
  3435. ' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGES)
  3436. '
  3437. 10390 A$ = "Recover Msg #"
  3438.       GOSUB 12995
  3439.       CALL CHECKINT (B$(1))
  3440.       IF EC <> 0 THEN _
  3441.          GOTO 10390
  3442.       MESSAGE.TO.RECOVER = TESTED.INTEGER.VALUE
  3443.       IF MESSAGE.TO.RECOVER < 1 THEN _
  3444.          GOTO 12980
  3445.       GOSUB 5344
  3446.       ACTION.FLAG = FALSE
  3447.       CALL RECOVMSG (MESSAGE.TO.RECOVER,FIRST.MESSAGE.RECORD,ACTION.FLAG)
  3448. 10392 IF ACTION.FLAG THEN _
  3449.          GOTO 1900
  3450.       RETURN
  3451. '
  3452. ' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)
  3453. '
  3454. 10530 A$ = "Delete comments (Y/[N])"
  3455.       GOSUB 12995
  3456.       IF YES THEN _
  3457.          CALL OPENOUTW (COMMENTS.FILE$)
  3458.       CLOSE 2
  3459. 10550 RETURN
  3460. '
  3461. ' *  TIME LIMIT EXCEEDED EXIT
  3462. '
  3463. 10553 CALL UPDTCALR ("Time limit exceeded",1)
  3464.       CALL QTPUT1 ("You have no time left")
  3465. '
  3466. ' *  Q - COMMAND FROM GLOBAL FUNCTIONS
  3467. '
  3468. 10560 GOSUB 9100
  3469.       IF NOT SYSOP AND _
  3470.          USER.SECURITY.LEVEL < SECURITY.EXEMPT.FROM.EPILOG THEN _
  3471.            FILE.NAME$ = EPILOG$ : _
  3472.            GOSUB 11520
  3473.       IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  3474.          CALL UPDTCALR ("Logged off",1)
  3475.       CALL MUZAK (4)
  3476.       GOTO 10595
  3477. 10570 IF TIME.REMAINING! > 1 AND (TURBO.KEY.USER OR NOT EXPERT.USER) THEN _
  3478.          A$ = "End session (Y,[N])" : _
  3479.          GOSUB 12999 : _
  3480.          IF NOT YES THEN _
  3481.             RETURN
  3482.       GET.OUT = TRUE
  3483.       GOTO 10560
  3484. 10590 CALL UPDTCALR ("Sleep Disconnect",1)
  3485.       SUB.BOARD = FALSE
  3486. 10595 CALL GETIME
  3487.       GOSUB 13700
  3488.       SUBROUTINE.PARAMETER = 0
  3489.       CALL CARRIER
  3490.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3491.          GOTO 10597
  3492.       IF GRN$ = ORIG.MSG.NAME$ THEN _
  3493.          GET.OUT = TRUE
  3494.       IF (SUB.BOARD AND NOT GET.OUT) THEN _
  3495.          GOSUB 5380 : _
  3496.          B$(2) = "MAIN" : _
  3497.          Z$ = "MAIN" : _
  3498.          Q = 2 : _
  3499.          FF = 8 : _
  3500.          CALL QTPUT1 ("Time limit exceeded in " + GRN$) : _
  3501.          SUB.BOARD = FALSE : _
  3502.          GOTO 1240
  3503. 10597 CALL UPDATEU (TRUE)
  3504.       GOTO 13540
  3505. 10620 CALL UPDTCALR(LG$(LOGON.ERROR.INDEX),2)
  3506.       IF EXIT.TO.DOORS THEN _
  3507.          CALL UPDATEU (TRUE)
  3508. 10621 IF ACTIVE.USER.NAME$ = "" THEN _
  3509.          ACTIVE.USER.NAME$ = "NAME UNAVAILABLE"
  3510.       Z$ = ACTIVE.USER.NAME$ + _
  3511.            " on at " + _
  3512.            CURRENT.DATE$ + _
  3513.            ", " + _
  3514.            TIM$ + _
  3515.            "** LOGON DENIED **, " + _
  3516.            BAUD.PARITY$
  3517.       NG$ = Z$ + _
  3518.             SPACE$(128 - LEN(Z$))
  3519. 10698 CALL MUZAK (5)
  3520.       A$ = "Access denied!"
  3521.       GOSUB 12976
  3522.       CALL DELAYIT (8 + BPS)
  3523.       GOTO 13545
  3524. '
  3525. ' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)
  3526. '
  3527. 10925 UTILITY.MARGIN.CHANGE = TRUE
  3528.       GOSUB 3100
  3529.       UTILITY.MARGIN.CHANGE = FALSE
  3530.       RETURN
  3531. '
  3532. ' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)
  3533. '
  3534. 10930 IF DOS.VERSION < 2 OR _
  3535.          (REQUIRED.RINGS = 0 AND NOT SHOOT.YOURSELF) THEN _
  3536.          CALL QTPUT1 ("Remote DOS unavailable") : _
  3537.          RETURN
  3538. 10932 IF LOCAL.USER AND NOT DEBUG THEN _
  3539.          CALL QTPUT1 ("Only for remote SYSOP's") : _
  3540.          RETURN
  3541.       CALL DOSEXIT
  3542.       SUBROUTINE.PARAMETER = -9
  3543.       CALL FINDFUNC
  3544.       GOTO 202
  3545. '
  3546. ' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)
  3547. '
  3548. 10970 IF NOT DOORS.AVAILABLE OR _
  3549.          (REQUIRED.RINGS = 0 AND NOT SHOOT.YOURSELF) THEN _
  3550.          CALL QTPUT1 ("All doors locked!") : _
  3551.          RETURN
  3552.       IF TIME.LOCK AND 1 AND NOT HAS.DOORED THEN _
  3553.          CALL TIMELOCK : _
  3554.          IF NOT OK THEN _
  3555.             RETURN
  3556. 10974 A1$ = MENU$(5)
  3557.       CALL TALK (5,A$)
  3558.       CALL SUBMENU ("Open which door, L)ist" + PRESS.ENTER.EXPERT$, _
  3559.                     A1$,"",".BAT","",_
  3560.                     USER.GRAPHIC.DEFAULT$,TRUE,FALSE,TRUE,"")
  3561.       IF Q = 0 THEN _
  3562.          RETURN
  3563.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3564.          RETURN 10595
  3565. 10986 Z$ = FILE.NAME$
  3566.       CALL DOOREXIT
  3567.       RETURN
  3568. '
  3569. ' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)
  3570. '
  3571. 11000 TU = USER.FILE.INDEX
  3572.       USER.RECORD.HOLD$ = USER.RECORD$
  3573.       REG.DATE.HOLD$ = REG.DATE$
  3574. 11001 STOP.INTERRUPTS = TRUE
  3575.       I = 1
  3576.       SCAN.USERS = FALSE
  3577.       TURBO.KEY = -TURBO.KEY.USER
  3578.       A$ = "A)dd, L)st, P)rt, M)od, S)can users"
  3579.       GOSUB 12998
  3580. 11003 IF Q = 0 THEN _
  3581.          GOTO 20093
  3582.       QQ = 0
  3583.       Z$ = LEFT$(B$(1),1)
  3584.       CALL ALLCAPS (Z$)
  3585.       IF Z$ = "A" THEN _
  3586.          GOTO 12300 _
  3587.       ELSE IF Z$ = "M" THEN _
  3588.               STOP.INTERRUPTS = TRUE _
  3589.            ELSE IF Z$ = "P" THEN _
  3590.                    QQ = TRUE _
  3591.                 ELSE IF Z$ = "S" THEN _
  3592.                         SCAN.USERS = TRUE : _
  3593.                         STOP.INTERRUPTS = TRUE _
  3594.                      ELSE IF Z$ <> "L" THEN _
  3595.                              GOTO 11001
  3596. 11005 CALL OPENUSER (HIGHEST.USER.RECORD)
  3597.       GOSUB 9450
  3598.       Z = 1
  3599.       IF SCAN.USERS THEN _
  3600.          A$ = "Scan for N)ame, P)wd, C)" + USER.LOCATION$ + ", L)evel" + _ ' KG072002
  3601.               LEFT$(", H)ash id",-9*(START.HASH > 1 AND LEN.HASH > 0)) : _
  3602.          GOSUB 12999 : _
  3603.          A$ = "" : _
  3604.          SCAN.FUNCTION$ = LEFT$(B$(1),1) : _
  3605.          CALL ALLCAPS (SCAN.FUNCTION$) : _
  3606.          CR = 0 : _
  3607.          GOSUB 12979 : _
  3608.          GOSUB 12966 : _
  3609.          GOTO 12962
  3610. 11010 FOR J = Z TO HIGHEST.USER.RECORD
  3611.          GET 5,J
  3612. 11015    X$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  3613.          IF ASC(X$) = 0 OR LEFT$(X$,3) = "   " THEN _
  3614.             GOTO 11310
  3615.          OF = CVI(SECURITY.LEVEL$)
  3616.          IF OF > USER.SECURITY.LEVEL THEN _
  3617.             IF NOT GLOBAL.SYSOP THEN _
  3618.                GOTO 11310
  3619.          A$ = FG.4$ + RIGHT$("     " + STR$(LOC(5)),4) + _
  3620.               ":" + _
  3621.               FG.1$ + USER.NAME$ + _
  3622.               FG.2$ + "SECURITY" + _
  3623.               RIGHT$("     " + STR$(OF),5) + _
  3624.               " "
  3625. 11020    A$ = A$ + _
  3626.               FG.3$ + "Password = " + _
  3627.               PASSWORD$ + EMPHASIZE.OFF$
  3628. 11025    IF QQ THEN _
  3629.             CALL PRINTIT (A$)
  3630. 11027    GOSUB 12979
  3631.          IF RET <> 0 THEN _
  3632.             GOTO 11330
  3633.          IF OF < ORIG.MIN.SEC THEN _
  3634.             A$ = EMPHASIZE.ON$ + "<Locked out>" + EMPHASIZE.OFF$ + SPACE$(7) : _
  3635.             GOTO 11030
  3636.          IF OF >= SYSOP.SECURITY.LEVEL THEN _
  3637.             A$ = EMPHASIZE.ON$ + "  (SYSOP)  " + EMPHASIZE.OFF$ + SPACE$(8) : _
  3638.             GOTO 11030
  3639.          A$ = SPACE$(19)
  3640. 11030    A$ = A$ + _
  3641.               LAST.DATE.TIME.ON$ + _
  3642.              "   " + _
  3643.              FG.4$ + CITY.STATE$ + EMPHASIZE.OFF$
  3644. 11100    IF QQ THEN _
  3645.             CALL PRINTIT (A$)
  3646. 11101    CALL QTPUT1 (A$)
  3647.         IF RET <> 0 THEN _
  3648.            GOTO 11330
  3649.         A$ = "  DOWNLOADS = " + _
  3650.              RIGHT$("     " + STR$(CVI(USER.DOWNLOADS$)),5) + _
  3651.              "   " + _
  3652.              "UPLOADS = " + _
  3653.              RIGHT$("     " + STR$(CVI(USER.UPLOADS$)),5) + _
  3654.              "   " + _
  3655.              " Times on ="
  3656.          A$ = A$ + RIGHT$("     " + STR$(CVI(MID$(USER.OPTIONS$,1,2))),5) + _
  3657.              "   " + _
  3658.              "TIME USED = " + _
  3659.              RIGHT$("    " + STR$(CVI(ELAPSED.TIME$)),4) + _
  3660.              " Min"
  3661.         IF QQ THEN _
  3662.            CALL PRINTIT (A$)
  3663. 11105   CALL QTPUT1 (A$)
  3664.         IF RET <> 0 THEN _
  3665.            GOTO 11330
  3666.          IF NOT ENFORCE.UPLOAD.DOWNLOAD.RATIOS THEN _
  3667.             GOTO 11106
  3668.          A$ = "BYTES: Dwn=" + STR$(CVS(DL.BYTES$)) + _
  3669.               "  Up=" + STR$(CVS(UL.BYTES$)) + _
  3670.               " TODAY Dwn: #=" + STR$(CVS(TODAY.DL$)) + _
  3671.               " Bytes=" + STR$(CVS(TODAY.BYTES$))
  3672.          IF QQ THEN _
  3673.             CALL PRINTIT (A$)
  3674.          CALL QTPUT1 (A$)
  3675.          IF RET <> 0 THEN _
  3676.             GOTO 11330
  3677. 11106   IF (START.INDIV = 0 OR LEN.INDIV = 0) AND _
  3678.            (START.HASH = 0 OR LEN.HASH = 0) AND _
  3679.            NOT RESTRICT.BY.DATE THEN _
  3680.               GOTO 11107
  3681.         IF (START.HASH > 1 AND LEN.HASH > 0) THEN _
  3682.            A$ = "Hash: " + MID$(USER.RECORD$,START.HASH,LEN.HASH) _
  3683.         ELSE A$ = ""
  3684.         IF (START.INDIV > 1 AND LEN.INDIV > 0) THEN _
  3685.            A$ = A$ + " Indiv: " + MID$(USER.RECORD$,START.INDIV,LEN.INDIV)
  3686.         IF RESTRICT.BY.DATE THEN _
  3687.             GOSUB 11480 : _
  3688.             A$ = A$ + "  Registered: " + _
  3689.                  REG.DISPLAY.DATE$
  3690.         CALL QTPUT1 (A$)
  3691.         IF QQ THEN _
  3692.            CALL PRINTIT (A$)
  3693.         IF RET <> 0 THEN _
  3694.            GOTO 11330
  3695. 11107   IF NOT STOP.INTERRUPTS THEN _
  3696.            GOTO 11310
  3697. 11110   A$ = "D)el,F)ind,M)enu,N)ew pwd,P)rnt,R)eset grph,Q)uit,S)ecLvl,U)ser#"
  3698.         IF RESTRICT.BY.DATE THEN _
  3699.            A$ = A$ + _
  3700.                 ",$)RegDate"
  3701.         GOSUB 12999
  3702.         IF NOT SCAN.USERS AND Q = 0 THEN _
  3703.            GOTO 11310
  3704. 11115   Z$ = LEFT$(B$(1),1)
  3705.         CALL ALLCAPS (Z$)
  3706.         X = INSTR("DNPQFSMR$U",Z$)
  3707.         IF Z$ = "" AND SCAN.USERS THEN _
  3708.            GOTO 12965
  3709.         ON X GOTO 11130,11160,11220,11320,11340,11390,11330,11400,11450,11127
  3710.         GOTO 11110
  3711. 11125   Z = VAL(B$)
  3712.         IF Z < 1 OR Z > HIGHEST.USER.RECORD THEN _
  3713.            GOTO 11127
  3714.         GOTO 11010
  3715. 11127   A$ = "What record #"
  3716.         GOSUB 12995
  3717.         GOTO 11125
  3718. '
  3719. ' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)
  3720. '
  3721. 11130   A$ = "Delete user (Y/[N])"
  3722.         GOSUB 12995
  3723.         IF YES THEN _
  3724.            LSET USER.NAME$ = CHR$(0) + _
  3725.                              "deleted user" : _
  3726.            LSET SECURITY.LEVEL$ = MKI$(MINIMUM.LOGON.SECURITY - 1) : _
  3727.            LSET LAST.DATE.TIME.ON$ = "01-01-80" + _
  3728.                                      " " + _
  3729.                                      TIME.LOGGED.ON$
  3730.         GOTO 11290
  3731. '
  3732. ' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)
  3733. '
  3734. 11160   GOSUB 12800
  3735.         GOTO 11290
  3736. '
  3737. ' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)
  3738. '
  3739. 11220   QQ = NOT QQ
  3740.         GOTO 11015
  3741. 11290   USER.FILE.INDEX = LOC(5)
  3742.         GOSUB 12989
  3743.         GOSUB 9440
  3744.         GOSUB 12991
  3745.         USER.FILE.INDEX = 0
  3746.         GOTO 11015
  3747. 11310   IF SCAN.USERS THEN _
  3748.            GOTO 12965
  3749. 11311 NEXT
  3750. '
  3751. ' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)
  3752. '
  3753. 11320 USER.FILE.INDEX = TU
  3754.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  3755.       REG.DATE$ = REG.DATE.HOLD$
  3756.       RETURN 1200
  3757. '
  3758. ' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)
  3759. '
  3760. 11330 CLOSE 2
  3761.       GOTO 11001
  3762. '
  3763. ' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)
  3764. '
  3765. 11340 A$ = PROMPT.HASH$ + _
  3766.            " to find"
  3767.       CALL SKIPLINE (1)
  3768.       GOSUB 12995
  3769.       IF Q = 0 THEN _
  3770.          GOTO 11340
  3771.       TEMP.HASH.VALUE$ = B$
  3772.       IF LEN(TEMP.HASH.VALUE$) < 3 OR LEN(TEMP.HASH.VALUE$) > LEN.HASH THEN _
  3773.          GOTO 11340
  3774.       CALL ALLCAPS (TEMP.HASH.VALUE$)
  3775.       IF START.INDIV < 1 THEN _
  3776.          GOTO 11345
  3777. 11342 A$ = PROMPT.INDIV$ + _
  3778.            " to find"
  3779.       GOSUB 12995
  3780.       IF Q = 0 THEN _
  3781.          GOTO 11342
  3782.       TEMP.INDIV.VALUE$ = B$
  3783.       IF LEN(TEMP.INDIV.VALUE$) > LEN.INDIV THEN _
  3784.          GOTO 11342
  3785.       CALL ALLCAPS (TEMP.INDIV.VALUE$)
  3786. 11345 GOSUB 12600
  3787.       GOSUB 12984
  3788.       USER.FILE.INDEX = 0
  3789.       IF FOUND THEN _
  3790.          GOTO 11015
  3791. 11380 A$ = TEMP.HASH.VALUE$ + _
  3792.            " " + _
  3793.            TEMP.INDIV.VALUE$ + _
  3794.            " not found"
  3795.       GOSUB 12977
  3796.       GOTO 11310
  3797. '
  3798. ' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)
  3799. '
  3800. 11390 GOSUB 11395
  3801.       LSET SECURITY.LEVEL$ = MKI$(OF)
  3802.       GOTO 11290
  3803. 11395 A$ = "New sec level"
  3804.       GOSUB 12995
  3805.       CALL ALLCAPS (B$(1))
  3806.       Z$ = B$(1)
  3807.       OF = VAL(Z$)
  3808.       IF OF > USER.SECURITY.LEVEL THEN _
  3809.          OF = USER.SECURITY.LEVEL
  3810.       RETURN
  3811. '
  3812. ' *  R - COMMAND FROM 5- USER MAINTENANCE OPTIONS (RESET USER GRAPHICS)
  3813. '
  3814. 11400 A = CVI(MID$(USER.OPTIONS$,9,2))
  3815.       A = A AND &HFAFF                ' TURN HIGHLIGHTING OFF
  3816.       LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,5) + _
  3817.                            "0" + _
  3818.                            MID$(USER.OPTIONS$,7,2) + _
  3819.                            MKI$(A) + _
  3820.                            MID$(USER.OPTIONS$,11)
  3821.       GOTO 11290
  3822. '
  3823. ' *  $ - COMMAND FROM 5 - USER MAINTENANCE (CHANGE REGISTRATION DATE)
  3824. '
  3825. 11450 A$ = "Enter new registration date (MM-DD-YY)"
  3826.       GOSUB 12995
  3827.       IF Q = 0 THEN _
  3828.          GOTO 11015
  3829. 11455 WORK.DATE$ = B$(1)
  3830.       IF LEN(WORK.DATE$) < 8 THEN _
  3831.          GOTO 11450
  3832.       GOSUB 11470
  3833.       IF NOT OK THEN _
  3834.          GOTO 11450
  3835.       LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,10) + _
  3836.                            REG.DATE$ + _
  3837.                            MID$(USER.OPTIONS$,13)
  3838.       GOSUB 11480
  3839.       REG.DATE$ = REG.DATE.HOLD$
  3840.       GOTO 11290
  3841. '
  3842. ' *  CALCULATE REGISTRATION DATES
  3843. '
  3844. 11470 IF LEN(WORK.DATE$) < 10 THEN _
  3845.          WORK.DATE$ = LEFT$(WORK.DATE$,6) + _
  3846.                       "19" + _
  3847.                       RIGHT$(WORK.DATE$,2)
  3848.       TODAY.REG.YY = VAL(MID$(WORK.DATE$,7))
  3849.       TODAY.REG.MM = VAL(LEFT$(WORK.DATE$,2))
  3850.       TODAY.REG.DD = VAL(MID$(WORK.DATE$,4,2))
  3851.       OK = TODAY.REG.YY > 1979 AND TODAY.REG.MM > 0 AND _
  3852.            TODAY.REG.MM < 13 AND TODAY.REG.DD > 0 AND _
  3853.            TODAY.REG.DD < 32
  3854.       IF OK THEN _
  3855.          CALL TWOBYTEDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,REG.DATE$)
  3856.       RETURN
  3857. 11480 X$ = MID$(USER.OPTIONS$,11,2)
  3858.       IF CVI(X$) <> 0 THEN _
  3859.          REG.DATE$ = X$ : _
  3860.       ELSE GOSUB 11482
  3861.       CALL UNCDATE (REG.DATE$,USER.REG.YY,USER.REG.MM,USER.REG.DD,REG.DISPLAY.DATE$)
  3862.       IF CVI(X$) = 0 THEN _
  3863.          REG.DISPLAY.DATE$ = "00-00-00"
  3864.       RETURN
  3865. 11482 WORK.DATE$ = DATE$
  3866.       GOTO 11470
  3867. '
  3868. ' *  ALLOW USERS TO ANSWER A "QUESTIONNAIRE" BASED ON THE RBBS-PC SCRIPT
  3869. '
  3870. 11520 CALL ASKUSERS
  3871.       IF NOT OK THEN _
  3872.          RETURN
  3873.       IF ADJUSTED.SECURITY THEN _
  3874.          GOSUB 12989 : _
  3875.          LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  3876.          GOSUB 9440 : _
  3877.          GOSUB 12991 : _
  3878.          CALL CALLOPT : _
  3879.          CALL XFERTYPE (2,TRUE) : _
  3880.          GOSUB 5135
  3881.       REDIM A$(ADIM)
  3882.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3883.          RETURN 10595
  3884.       OK = TRUE
  3885.       RETURN
  3886. '
  3887. ' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)
  3888. '
  3889. 12300 A1$ = ""
  3890.       ATTEMPTS = 0
  3891.       USER.SECURITY.LEVEL.SAVE = USER.SECURITY.LEVEL
  3892.       FIRST.NAME.SAVE$ = FIRST.NAME$
  3893.       LAST.NAME.SAVE$ = LAST.NAME$
  3894.       ACTIVE.USER.NAME.SAVE$ = ACTIVE.USER.NAME$
  3895.       CITY.STATE.SAVE$ = CI$
  3896.       HASH.VALUE.SAVE$ = HASH.VALUE$
  3897.       INDIV.VALUE.SAVE$ = INDIV.VALUE$
  3898.       GOSUB 12500
  3899.       GOSUB 12840
  3900.       GOSUB 12850
  3901.       GOSUB 12598
  3902.       IF USER.FILE.INDEX = 0 THEN _
  3903.          GOSUB 12984 : _
  3904.          GOTO 12330
  3905.       IF FOUND THEN _
  3906.          D$ = "User already exists" : _
  3907.          GOSUB 1315 : _
  3908.          GOSUB 12984 : _
  3909.          GOTO 12330
  3910. 12310 GOSUB 12630
  3911.       GOSUB 12800
  3912.       GOSUB 11395
  3913.       TEMP.SECURITY.LEVEL = OF
  3914.       GOSUB 12900
  3915.       LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  3916.                                 " " + _
  3917.                                 TIME.LOGGED.ON$
  3918.       GOSUB 12960
  3919.       CALL ALLCAPS (B$)
  3920.       LSET CITY.STATE$ = B$
  3921.       LSET ELAPSED.TIME$ = MKI$(0)
  3922.       IF START.HASH > 1 THEN _
  3923.          MID$(USER.RECORD$,START.HASH,LEN.HASH) = HASH.VALUE$
  3924.       IF START.INDIV > 1 THEN _
  3925.          MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  3926.       GOSUB 9440
  3927. 12320 GOSUB 12991
  3928. 12330 USER.SECURITY.LEVEL = USER.SECURITY.LEVEL.SAVE
  3929.       FIRST.NAME$ = FIRST.NAME.SAVE$
  3930.       LAST.NAME$ = LAST.NAME.SAVE$
  3931.       ACTIVE.USER.NAME$ = ACTIVE.USER.NAME.SAVE$
  3932.       CI$ = CITY.STATE.SAVE$
  3933.       HASH.VALUE$ = HASH.VALUE.SAVE$
  3934.       INDIV.VALUE$ = INDIV.VALUE.SAVE$
  3935.       USER.FILE.INDEX = TU
  3936.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  3937.       GOTO 11001
  3938. '
  3939. ' *  GET USER FIRST AND LAST NAMES
  3940. '
  3941. 12500 IF ATTEMPTS > 5 THEN _
  3942.          FF = TRUE : _
  3943.          RETURN
  3944. 12510 GOSUB 12700
  3945.       ATTEMPTS = ATTEMPTS + 1
  3946.       A$ = A1$ + _
  3947.            FIRST.NAME.PROMPT$
  3948.       CALL SKIPLINE (1)
  3949.       LOGON.ACTIVE = TRUE
  3950.       GOSUB 12555
  3951.       LOGON.ACTIVE = FALSE
  3952.       CALL TRIM (Z$)
  3953.       FIRST.NAME$ = Z$
  3954.       IF Q <> 1 THEN _
  3955.          I = 2: _
  3956.          GOSUB 12556 : _
  3957.          GOTO 12540
  3958. 12530 A$ = A1$ + _
  3959.            LAST.NAME.PROMPT$
  3960.       GOSUB 12555
  3961.       IF Q > 0 AND INSTR(B$,";") = 0 THEN _
  3962.          Z$ = B$ _
  3963.       ELSE Z$ = B$(1)
  3964.       CALL ALLCAPS (Z$)
  3965. 12540 CALL TRIM (Z$)
  3966.       LAST.NAME$ = Z$
  3967.       IF LEN(LAST.NAME$) < 2 THEN _
  3968.          IF LEN(FIRST.NAME$) > 2 THEN _
  3969.             GOTO 12500
  3970.       IF (LEN(FIRST.NAME$) + LEN(LAST.NAME$)) > 30 THEN _
  3971.          GOTO 12500
  3972.       IF USER.SECURITY.LEVEL.SAVE < SYSOP.SECURITY.LEVEL THEN _
  3973.          IF (LEN(FIRST.NAME$) < 2 OR LEN(LAST.NAME$) < 2) THEN _
  3974.             GOTO 12500 _
  3975.          ELSE IF LEFT$(FIRST.NAME$,1)=" " OR LEFT$(LAST.NAME$,1)=" " THEN _
  3976.                  GOTO 12500
  3977. 12550 ACTIVE.USER.NAME$ = MID$(FIRST.NAME$ + " " + LAST.NAME$,1,31)
  3978.       IF HASH.INDIV > 1 THEN _
  3979.          IF Q < 3 THEN _
  3980.             GOSUB 12558 : _
  3981.             IF NO THEN _
  3982.                GOTO 12500
  3983.       Z$ = FIRST.NAME$
  3984.       RETURN
  3985. '
  3986. ' *  CHECK FOR NAMES NOT ALLOWED
  3987. '
  3988. 12555 GOSUB 12995
  3989.       IF Q = 0 THEN _
  3990.          RETURN 12500
  3991.       I = 1
  3992. 12556 Z$ = B$(I)
  3993. 12557 CALL ALLCAPS (Z$)
  3994.       CALL REMNONALF (Z$,31,91)
  3995.       RETURN
  3996. 12558 A$ = "Are you '" + _
  3997.            ACTIVE.USER.NAME$ + _
  3998.            "' ([Y],N)"
  3999.       GOSUB 12995
  4000.       RETURN
  4001. 12570 FOUND = FALSE
  4002.       CALL OPENWORK (2,TRASHCAN.FILE$)
  4003.       IF EC = 53 THEN _
  4004.          GOTO 710
  4005. 12580 IF EOF(2) THEN _
  4006.          RETURN
  4007.       INPUT #2,INVALID.NAME$
  4008.       IF Z$ <> INVALID.NAME$ THEN _
  4009.          GOTO 12580
  4010.       FOUND = TRUE
  4011.       RETURN
  4012. 12595 CALL QTPUT1 ("Name not valid here. Call recorded")
  4013.       CALL UPDTCALR ("Name violation: "+ACTIVE.USER.NAME$,1)
  4014.       GOTO 10621
  4015. '
  4016. ' *  COMMON SEARCH USER FILE ROUTINE
  4017. '
  4018. 12598 TEMP.HASH.VALUE$ = HASH.VALUE$
  4019.       TEMP.INDIV.VALUE$ = INDIV.VALUE$
  4020. 12600 GOSUB 4910
  4021.       GOSUB 12988
  4022.       IF IN.CONF.MENU THEN _
  4023.          IF NOT PRIVATE.DOOR THEN _
  4024.             CALL QTPUT1 ("Checking Users...")
  4025. 12605 CALL OPENUSER (HIGHEST.USER.RECORD)
  4026.       GOSUB 9450
  4027.       CALL FINDUSER (TEMP.HASH.VALUE$,TEMP.INDIV.VALUE$,START.HASH,LEN.HASH,_
  4028.                      START.INDIV,LEN.INDIV,HIGHEST.USER.RECORD,FOUND,_
  4029.                      USER.FILE.INDEX,SL)
  4030.      IF FOUND THEN _
  4031.         RETURN
  4032.      IF CURRENT.USER.COUNT < (HIGHEST.USER.RECORD-1)*.95 THEN _
  4033.         RETURN
  4034.      A$ = "No room for new users in " + GRN$
  4035.      CALL UPDTCALR (A$,2)
  4036.      IF ACTIVE.USER.FILE$ <> MAIN.USER.FILE$ THEN _
  4037.         USER.FILE.INDEX = 0 : _
  4038.         RETURN
  4039.       IF REMEMBER.NEW.USERS AND NOT SURVIVE.NOUSER.ROOM THEN _
  4040.          GOSUB 1397
  4041.       USER.FILE.INDEX = 0
  4042.       IF SURVIVE.NOUSER.ROOM THEN _
  4043.          REMEMBER.NEW.USERS = FALSE
  4044.       RETURN
  4045. '
  4046. ' *  AUGMENT USER COUNT, LOCK 4 REC BLOCK IN USER, UNLOCK FILES
  4047. '
  4048. 12630 GOSUB 23000
  4049.       CURRENT.USER.COUNT = CURRENT.USER.COUNT + (SL = 0) * REMEMBER.NEW.USERS
  4050. 12632 GOSUB 24000
  4051.       GOSUB 12985
  4052.       IF REMEMBER.NEW.USERS THEN _
  4053.          GOSUB 12989
  4054.       GOSUB 12990
  4055.       RETURN
  4056. '
  4057. ' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING
  4058. '
  4059. 12700 IF CONFERENCE.MODE THEN _
  4060.          A$ = "Users of " + _
  4061.               GRN$ + _
  4062.               ":" : _
  4063.          GOSUB 12979
  4064.       RETURN
  4065. '
  4066. ' *  GET PASSWORD FROM NEWUSER
  4067. '
  4068. 12800 CALL NEWPASWRD ("Enter PASSWORD you'll use to logon again",FALSE)
  4069.       IF SUBROUTINE.PARAMETER < 0 THEN _
  4070.          GOTO 202
  4071.       IF USER.SECURITY.LEVEL.SAVE < SYSOP.SECURITY.LEVEL THEN _
  4072.          IF B$ = SPACE$(LEN(B$)) THEN _
  4073.             GOTO 12800
  4074.       LSET PASSWORD$ = Z$
  4075.       RETURN
  4076. '
  4077. ' *  GET HASH VALUE FOR CURRENT USER TO LOOK UP IN THE USER'S FILE
  4078. '
  4079. 12840 IF START.HASH = 1 THEN _
  4080.          HASH.VALUE$ = ACTIVE.USER.NAME$ : _
  4081.          RETURN
  4082.       X$ = A1$ + _
  4083.            PROMPT.HASH$
  4084.       CALL UNTILRIGHT (X$,HASH.VALUE$,2,LEN.HASH)
  4085.       RETURN
  4086. '
  4087. ' *  GET FIELD TO INDIVIDUATE ONE USER FROM ANOTHER (NAME FIELD IS DEFAULT)
  4088. '
  4089. 12850 IF START.INDIV < 1 THEN _
  4090.          RETURN
  4091.       IF START.INDIV = 1 THEN _
  4092.          INDIV.VALUE$ = ACTIVE.USER.NAME$ : _
  4093.          RETURN
  4094.       X$ = A1$ + _
  4095.            PROMPT.INDIV$
  4096.       CALL UNTILRIGHT (X$,INDIV.VALUE$,2,LEN.INDIV)
  4097.       RETURN
  4098. '
  4099. ' *  SET NEWUSER DEFAULTS
  4100. '
  4101. 12900 LSET USER.NAME$ = ACTIVE.USER.NAME$
  4102.       LSET USER.OPTIONS$ = MKI$(0) + _
  4103.                            MKI$(0) + _
  4104.                            " 0" + _
  4105.                            MKI$(64) + _
  4106.                            MKI$(16) + _
  4107.                            MKI$(0) + _
  4108.                            CHR$(23) + _
  4109.                            DEFAULT.ECHOER$
  4110.       LSET USER.DOWNLOADS$ = MKI$(0)
  4111.       LSET USER.UPLOADS$ = MKI$(0)
  4112.       IF ENFORCE.UPLOAD.DOWNLOAD.RATIOS THEN _
  4113.          LSET TODAY.DL$ = MKS$(0) : _
  4114.          LSET TODAY.BYTES$ = MKS$(0) : _
  4115.          LSET DL.BYTES$ = MKS$(0) : _
  4116.          LSET UL.BYTES$ = MKS$(0)
  4117.       LSET SECURITY.LEVEL$ = MKI$(TEMP.SECURITY.LEVEL)
  4118.       LSET ELAPSED.TIME$ = MKI$(0)
  4119.       RETURN
  4120. '
  4121. ' *  GET CITY AND STATE FROM NEWUSER
  4122. '
  4123. 12960 A$ = A1$ + _
  4124.            USER.LOCATION$
  4125.       GOSUB 12995
  4126.       IF Q = 0 THEN _
  4127.          GOTO 12960
  4128.       IF B$ = SPACE$(LEN(B$)) THEN _
  4129.          GOTO 12960
  4130.       CALL ALLCAPS (B$)
  4131.       LSET CITY.STATE$ = B$
  4132.       CI$ = B$
  4133.       RETURN
  4134. '
  4135. ' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)
  4136. '
  4137. 12962 X = 0
  4138.       FF = FALSE
  4139.       MACRO.MIN = 99
  4140.       A$ = "String to search"
  4141.       GOSUB 12998
  4142.       IF Q = 0 THEN _
  4143.          GOTO 11001
  4144.       CALL ALLCAPS (B$)
  4145.       WK$ = B$
  4146.       IF SCAN.FUNCTION$ = "L" THEN _
  4147.          WK$ = "," + _
  4148.                STR$(VAL(WK$)) + _
  4149.                ","
  4150. 12963 GET 5,I
  4151.       GOSUB 12966
  4152.       X = INSTR(SCAN.FIELD$,WK$)
  4153.       IF X > 0 THEN _
  4154.          GOTO 11015
  4155. 12965 I = I + 1
  4156.       IF I > HIGHEST.USER.RECORD THEN _
  4157.          LSET USER.RECORD$ = USER.RECORD.HOLD$ : _
  4158.          GOTO 11001
  4159.       X = 0
  4160.       GOTO 12963
  4161. 12966 FF = INSTR("NCPLH",SCAN.FUNCTION$)
  4162. 12967 ON FF GOTO 12968,12969,12970,12972,12971
  4163.       GOTO 11001
  4164. '
  4165. ' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)
  4166. '
  4167. 12968 SCAN.FIELD$ = USER.NAME$
  4168.       RETURN
  4169. '
  4170. ' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST)
  4171. '
  4172. 12969 SCAN.FIELD$ = CITY.STATE$
  4173.       RETURN
  4174. '
  4175. ' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)
  4176. '
  4177. 12970 SCAN.FIELD$ = PASSWORD$
  4178.       RETURN
  4179. '
  4180. ' *  H - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR HASH ID)
  4181. '
  4182. 12971 IF START.HASH > 0 AND LEN.HASH > 0 THEN _
  4183.          SCAN.FIELD$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  4184.       RETURN
  4185. '
  4186. ' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)
  4187. '
  4188. 12972 SCAN.FIELD$ = "," + _
  4189.                     STR$(CVI(SECURITY.LEVEL$)) + _
  4190.                     ","
  4191.       RETURN
  4192. '
  4193. ' * CALLS INTO SEPARATELY COMPILED SUBROUTINES (RBBS-SUB)
  4194. '
  4195. '
  4196. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE
  4197. '
  4198. 12975 SUBROUTINE.PARAMETER = 1
  4199.       GOTO 12981
  4200. 12976 SUBROUTINE.PARAMETER = 2
  4201.       GOTO 12981
  4202. 12977 SUBROUTINE.PARAMETER = 3
  4203.       GOTO 12981
  4204. 12978 SUBROUTINE.PARAMETER = 4
  4205.       GOTO 12981
  4206. 12979 SUBROUTINE.PARAMETER = 5
  4207.       GOTO 12981
  4208. 12980 SUBROUTINE.PARAMETER = 6
  4209. 12981 CALL TPUT
  4210. 12983 IF SUBROUTINE.PARAMETER < 0 THEN _
  4211.          GOTO 202
  4212.       IF SUBROUTINE.PARAMETER = 8 THEN _
  4213.          GOSUB 12995
  4214.       RETURN
  4215. '
  4216. ' * STANDARD ENTRY FOR RBBS-PC'S FILE LOCKING WHEN RUNNING MULTIPLE RBBS-PC'S
  4217. '
  4218. 12984 SUBROUTINE.PARAMETER = 1  ' LOCK USERS & MESSAGES
  4219.       GOTO 12994
  4220. 12985 SUBROUTINE.PARAMETER = 2  ' UNLOCK MESSAGES AND FLUSH
  4221.       FLUSHED = TRUE
  4222.       GOTO 12994
  4223. 12986 SUBROUTINE.PARAMETER = 3  ' LOCK MESSAGES
  4224.       GOTO 12994
  4225. 12987 SUBROUTINE.PARAMETER = 4  ' UNLOCK MESSAGES
  4226.       GOTO 12994
  4227. 12988 SUBROUTINE.PARAMETER = 5  ' LOCK USERS
  4228.       GOTO 12994
  4229. 12989 SUBROUTINE.PARAMETER = 6  ' LOCK USER BLOCK
  4230.       GOTO 12994
  4231. 12990 SUBROUTINE.PARAMETER = 7  ' UNLOCK USERS
  4232.       GOTO 12994
  4233. 12991 SUBROUTINE.PARAMETER = 8  ' UNLOCK USER BLOCK
  4234.       GOTO 12994
  4235. 12992 SUBROUTINE.PARAMETER = 9  ' LOCK COMMENTS/UPLOAD DIR
  4236.       GOTO 12994
  4237. 12993 SUBROUTINE.PARAMETER = 10 ' UNLOCK COMMENTS/UPLOAD DIR
  4238. 12994 CALL FILELOCK
  4239.       IF FLUSHED THEN _
  4240.          FIELD 1,128 AS MESSAGE.RECORD$ : _
  4241.          FLUSHED = FALSE
  4242.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4243.          SUBROUTINE.PARAMETER = -9 : _
  4244.          CALL FINDFUNC : _
  4245.          GOTO 202
  4246.       RETURN
  4247. '
  4248. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE
  4249. '
  4250. 12995 GOSUB 12997
  4251.       SUBROUTINE.PARAMETER = 1
  4252. 12996 CALL TGET
  4253. 12997 IF SUBROUTINE.PARAMETER < 0 THEN _
  4254.          GOTO 202
  4255.       RETURN
  4256. 12998 A$ = A$ + _
  4257.            PRESS.ENTER$
  4258.       GOTO 12995
  4259. 12999 TURBO.KEY = -TURBO.KEY.USER
  4260.       GOTO 12995
  4261. '
  4262. ' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE
  4263. '
  4264. 13000 IF DEBUG THEN _
  4265.          A$ = "DEBUG Trap ERL=" + _
  4266.               STR$(EL) + _
  4267.               " ERR=" + _
  4268.               STR$(EC) : _
  4269.               CALL PRINTIT(A$) : _
  4270.               D$ = A$ : _
  4271.               GOSUB 1315
  4272.       IF EL = 1905 AND EC = 63 THEN _
  4273.          CLOSE 1 : _
  4274.          KILL ACTIVE.MESSAGE.FILE$ : _
  4275.          GOTO 5350
  4276.       IF EL = 4371 AND EC = 6 THEN _
  4277.          GOTO 1200
  4278.       IF EL =  4740 THEN _
  4279.          GOTO 4745
  4280.       IF EL =  5151 AND EC = 62 THEN _
  4281.          CALL UPDTCALR (PASSWORDS.FILE$ + " bad format!",2) : _
  4282.          GOTO 5160
  4283. 13500 CALL LOGERROR
  4284.       CALL QTPUT1 (CALLERS.RECORD$)
  4285.       GOTO 1200
  4286. '
  4287. ' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")
  4288. '
  4289. 13538 CALL UPDTCALR ("No calls.  Recycling.",1)
  4290.       GOTO 13549
  4291. 13540 IF LOCAL.USER THEN _
  4292.          IF NOT LOCAL.USER.MODE THEN _
  4293.             GOTO 13549
  4294. 13543 IF (NOT SYSOP) THEN _
  4295.          IF ((USER.FILE.INDEX = 0 AND REMEMBER.NEW.USERS) OR _
  4296.             NEW.USER = TRUE) THEN _
  4297.             GOTO 13549
  4298. 13545 CALL UPDATEC
  4299. 13549 GOSUB 13700
  4300.       IF LOCAL.USER OR _
  4301.          MODEM.OFFHOOK THEN _
  4302.          GOTO 13555
  4303.       IF NOT FOSSIL THEN _
  4304.          OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) AND 254 : _
  4305.          CALL DELAYIT (DTR.DROP.DELAY) : _
  4306.          OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1 : _
  4307.          GOTO 13553
  4308. 13550 CALL FOSSTATUS(COMPORT%,STATUS%)
  4309.       STATUS% = STATUS% AND &H4000
  4310.       IF STATUS% <> &H4000 THEN _
  4311.          CALL DELAYIT (8 + BPS)
  4312.       STATE%=0
  4313.       CALL FOSDTR(COMPORT%,STATE%)
  4314.       CALL DELAYIT (DTR.DROP.DELAY)
  4315.       STATE%=1
  4316.       CALL FOSDTR(COMPORT%,STATE%)
  4317. 13553 CALL DELAYIT (DTR.DROP.DELAY)
  4318.       CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  4319.       CALL DELAYIT (MODEM.COMMAND.DELAY.TIME)
  4320. 13555 ACTIVE.MESSAGE.FILE$ = ORIG.MESSAGE.FILE$
  4321.       GOSUB 12986
  4322.       GOSUB 5344
  4323.       GET 1,NODE.RECORD.INDEX                                        ' KG061101
  4324.       MID$(MESSAGE.RECORD$,57,1) = "I"
  4325.       MID$(MESSAGE.RECORD$,40,2) = " 0"                              ' KG061101
  4326.       MID$(MESSAGE.RECORD$,72,2) = " 0"                              ' KG061101
  4327.       PUT 1,NODE.RECORD.INDEX
  4328.       GOSUB 12985
  4329.       CLOSE 1,2,4,5
  4330.       IF NOT FOSSIL THEN _
  4331.          CLOSE 3
  4332.       IF RECYCLE.TO.DOS THEN _
  4333.          GOTO 203
  4334.       RUN 100
  4335. 13600 CLS
  4336.       LOCATE ,,0
  4337.       CALL PSCRN (DF$ + " file not found/invalid.  Run CONFIG.")     ' KG072001
  4338.       CALL DELAYIT (3)
  4339.       GOTO 203
  4340. 13700 IF MESSAGE.FILE.LOCK THEN _
  4341.          GOSUB 12987
  4342. 13710 IF USER.FILE.LOCK THEN _
  4343.          GOSUB 12990
  4344. 13720 IF USER.BLOCK.LOCK THEN _
  4345.          GOSUB 12991
  4346.       RETURN
  4347. '
  4348. ' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)
  4349. '
  4350. 20093 IF USER.FILE.INDEX > 0 THEN _
  4351.          CALL OPENUSER (HIGHEST.USER.RECORD) : _
  4352.          GET 5,USER.FILE.INDEX : _
  4353.          GOSUB 9500
  4354. 20095 RETURN 1200
  4355. '
  4356. ' *  V - COMMAND FROM FILES MENU (VIEW ARC CONTENTS)
  4357. '
  4358. 20140 CALL GETARC
  4359.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4360.          GOTO 13540
  4361.       IF DENY.ACCESS THEN _
  4362.          GOTO 1386
  4363.       RETURN
  4364. '
  4365. ' * GO TO THE FILE SYSTEM TO LIST THE SYSOP'S COMMENTS
  4366. '
  4367. 20150 FILESYS.PARAMETER = 1
  4368.       GOTO 20200
  4369. '
  4370. ' * GO TO THE FILE SYSTEM TO LIST THE FILE DIRECTORIES
  4371. '
  4372. 20155 FILESYS.PARAMETER = 2
  4373.       GOTO 20200
  4374. '
  4375. ' * GO TO THE FILE SYSTEM TO DOWNLOAD FILES
  4376. '
  4377. 20160 FILESYS.PARAMETER = 3
  4378.       GOTO 20200
  4379. '
  4380. ' * GO TO THE FILE SYSTEM WHEN RETURNING FROM EXTERNAL PROTOCOLS
  4381. '
  4382. 20165 FILESYS.PARAMETER = 4
  4383.       GOTO 20200
  4384. '
  4385. ' * GO TO THE FILE SYSTEM TO UPLOAD FILES
  4386. '
  4387. 20170 FILESYS.PARAMETER = 5
  4388.       GOTO 20200
  4389. '
  4390. ' * GO TO THE FILE SYSTEM TO SCAN FILE SYSTEM DIRECTORIES
  4391. '
  4392. 20175 FILESYS.PARAMETER = 6
  4393.       GOTO 20200
  4394. '
  4395. ' * GO TO THE FILE SYSTEM TO HANDLE "PERSONAL" FILES
  4396. '
  4397. 20180 FILESYS.PARAMETER = 7
  4398.       GOTO 20200
  4399. '
  4400. ' * GO TO THE FILE SYSTEM TO LIST "NEW" FILES
  4401. '
  4402. 20185 FILESYS.PARAMETER = 8
  4403.       GOTO 20200
  4404. '
  4405. ' * RETURN TO THE FILE SYSTEM AFTER HANDLING EXTENDED FILE DESCRIPTIONS
  4406. '
  4407. 20190 FILESYS.PARAMETER = 9
  4408. 20200 CALL FILESYS
  4409.       ON FILESYS.PARAMETER GOTO 20205, _
  4410.                                 20210, _
  4411.                                 20215, _
  4412.                                 20220, _
  4413.                                 20225, _
  4414.                                 20230, _
  4415.                                 20235
  4416. 20205 RETURN
  4417. 20210 RETURN 202
  4418. 20215 RETURN 1200
  4419. 20220 RETURN 1380
  4420. 20225 SYSOP.COMMENT = TRUE
  4421.       MAX.MESSAGE.LINES = MAX.EXTENDED.LINES
  4422.       GOSUB 2008
  4423.       GOTO 20190
  4424. 20230 RETURN 10553
  4425. 20235 RETURN 10595
  4426. '
  4427. ' *  GET MESSAGE HEADER RECORD DATA
  4428. '
  4429. 23000 GET 1,1
  4430.       HIGH.MESSAGE.NUMBER = VAL(LEFT$(MESSAGE.RECORD$,8))
  4431.       AUTO.ADD.SECURITY   = CVI(MID$(MESSAGE.RECORD$,9,2))
  4432.       CALLS.TODATE! = VAL(MID$(MESSAGE.RECORD$,11,10))
  4433.       CURRENT.USER.COUNT = VAL(MID$(MESSAGE.RECORD$,57,5))
  4434.       FIRST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,68,7))
  4435.       NEXT.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,75,7))
  4436.       HIGHEST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,82,7))
  4437.       IF ACTIVE.MESSAGE.FILE$ = ORIG.MESSAGE.FILE$ THEN _
  4438.          NODES.IN.SYSTEM = VAL(MID$(MESSAGE.RECORD$,127))
  4439.       RETURN
  4440. 23100 GET 1,NEXT.MESSAGE.RECORD
  4441.       IF MID$(MESSAGE.RECORD$,61,1) = ":" THEN _
  4442.          CALL CHECKINT (MID$(MESSAGE.RECORD$,117,4)) : _
  4443.          IF EC = 0 AND (TESTED.INTEGER.VALUE > 1) AND (TESTED.INTEGER.VALUE < 100) THEN _
  4444.             Y = TESTED.INTEGER.VALUE : _
  4445.             CALL CHECKINT (MID$(MESSAGE.RECORD$,2,4)) : _
  4446.             IF EC = 0 AND TESTED.INTEGER.VALUE > HIGH.MESSAGE.NUMBER THEN _
  4447.                HIGH.MESSAGE.NUMBER = TESTED.INTEGER.VALUE : _
  4448.                NEXT.MESSAGE.RECORD = NEXT.MESSAGE.RECORD + Y : _
  4449.                CALL QTPUT1 ("Correcting Msg Header") : _
  4450.                MSG.CORRECTED = TRUE : _
  4451.                GOTO 23100
  4452.       RETURN
  4453. '
  4454. ' *  UPDATE MESSAGE HEADER RECORD DATA
  4455. '
  4456. 24000 MID$(MESSAGE.RECORD$,1,8) = STR$(HIGH.MESSAGE.NUMBER)
  4457.       MID$(MESSAGE.RECORD$,11,10) = STR$(CALLS.TODATE!)          
  4458.       MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT)          ' KG061502
  4459.       MID$(MESSAGE.RECORD$,68,7) = STR$(FIRST.MESSAGE.RECORD)
  4460.       MID$(MESSAGE.RECORD$,75,7) = STR$(NEXT.MESSAGE.RECORD)
  4461.       MID$(MESSAGE.RECORD$,82,7) = STR$(HIGHEST.MESSAGE.RECORD)
  4462.       PUT 1,1
  4463.       RETURN
  4464. '
  4465. ' * A - COMMAND FROM LIBRARY MENU (ARCHIVE A SELECTED LIBRARY DISK)
  4466. '
  4467. 30000 SUBROUTINE.PARAMETER = 4
  4468.       CALL LIBRARY
  4469.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4470.          RETURN 10595
  4471.       RETURN
  4472. '
  4473. ' * C - COMMAND FROM LIBRARY MENU (CHANGE TO A LIBRARY DISK)
  4474. '
  4475. 30100 SUBROUTINE.PARAMETER = 2
  4476.       CALL LIBRARY
  4477.       RETURN
  4478. '
  4479. ' * D - COMMAND FROM LIBRARY MENU (DOWNLOAD F DISK/FILE FROM LIBRARY)
  4480. '
  4481. 30200 IF TIME.LOCK AND 2 AND NOT HAS.PRIVDOOR THEN _                 ' KG052501
  4482.          CALL TIMELOCK : _
  4483.          IF NOT OK THEN _
  4484.             RETURN
  4485.       IF LIBRARY.DISK.CHAR$ = "0000" THEN _
  4486.          CALL QTPUT1 ("You must select a Library disk first!") : _
  4487.          RETURN
  4488.       SUBROUTINE.PARAMETER = 3
  4489.       CALL LIBRARY
  4490.       GOTO 20160
  4491. '
  4492. ' * CALCULATE TIME REMAINING FOR USER
  4493. '
  4494. 41000 CALL CHKTREMAIN (TIME.REMAINING!)
  4495.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4496.          RETURN 10553
  4497.       RETURN
  4498. '
  4499. ' * SHOW USER CURRENT ACCESS LEVEL
  4500. '
  4501. 41070 A$ = "Granted access level" + _
  4502.            STR$(USER.SECURITY.LEVEL) + _
  4503.            MID$(" (SYSOP)",1,-8 * (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL))
  4504.       GOSUB 12975
  4505.       RETURN
  4506. '
  4507. ' * NULLS SET FOR NEW USERS
  4508. '
  4509. 42700 CALL SKIPLINE (1)
  4510.       CALL QTPUT1 ("TurboKey: act on 1 character command without waiting for [ENTER]")
  4511.       A$ = "Want TurboKeys (Y/[N])"
  4512.       GOSUB 12999
  4513.       TURBO.KEY.USER = NOT YES
  4514.       CALL TOGGLE (8)
  4515.       RETURN
  4516. '
  4517. ' *  F - COMMAND FROM UTILITY MENU (FILE TRANSFER DEFALUT MODE)
  4518. ' *  FILE TRANSFER DEFAULT SET FOR NEW USERS
  4519. '
  4520. 42800 FF = INSTR(DFLTXFER$,USER.TRANSFER.DEFAULT$)
  4521.       IF FF = 0 THEN _
  4522.          FF = INSTR(INTERNAL.EQUIV$,"N")
  4523.       CALL QTPUT1 ("Current Protocol: "+MID$(DFLTXFER$,FF,1))
  4524. 42805 A$ = "Default "
  4525.       CALL XFERTYPE (1,EXPERT.USER)
  4526.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4527.          RETURN 10595
  4528.       USER.TRANSFER.DEFAULT$ = FT$
  4529. 42810 A$ = "PROTOCOL: " + PROTO.PROMPT$
  4530.       GOSUB 12979
  4531.       RETURN
  4532. '
  4533. ' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE TOGGLE)
  4534. ' *  UPPER/LOWER CASE SET FOR NEW USERS
  4535. '
  4536. 42850 IF Q > 1 THEN _
  4537.          X = 2 : _
  4538.          GOTO 42852
  4539.       GOSUB 9525
  4540. 42851 X = 1
  4541.       A$ = "Change to R)BBS, C)aller's software" + _
  4542.            MID$(", I)ntermediate host",1,-20 * (HOST.ECHO.ON$ <> "")) + _
  4543.            PRESS.ENTER.EXPERT$
  4544.       GOSUB 12999
  4545.       IF Q = 0 THEN _
  4546.          RETURN
  4547. 42852 Z$ = LEFT$(B$(X),1)
  4548.       CALL ALLCAPS (Z$)
  4549.       IF INSTR("ICR",Z$) = 0 THEN _
  4550.          GOTO 42851
  4551.       ECHOER$ = Z$
  4552.       CALL SETECHO (ECHOER$)
  4553.       GOSUB 9525
  4554.       RETURN
  4555. 42950 A$ = "CAN YOUR TERMINAL DISPLAY LOWER CASE ([Y]/N)"
  4556.       GOSUB 12995
  4557.       UPPER.CASE = NOT NO
  4558.       CALL TOGGLE(3)
  4559.       RETURN
  4560. '
  4561. ' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)
  4562. ' *  GRAPHIC MENUS SELECTION SET FOR NEW USERS
  4563. '
  4564. 43000 GOSUB 43005
  4565.       GOTO 43022
  4566. 43005 CALL ASKGRAPH (USER.GRAPHIC.DEFAULT$)
  4567.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4568.          RETURN 10595
  4569.       IF Q = 0 THEN _
  4570.          RETURN
  4571. 43020 A$ = "Text GRAPHICS: " + _
  4572.            MID$("None AsciiColor",GR * 5 + 1,5)
  4573.       GOSUB 12979
  4574.       RETURN
  4575. 43022 IF EMPHASIZE.ON.DEF$ = "" THEN _
  4576.          RETURN
  4577.       A$ = "Do you want COLORIZED prompts ([Y],N)"
  4578.       GOSUB 12999
  4579.       HIGHLIGHT.OFF = NOT NO
  4580.       CALL TOGGLE(5)
  4581.       RETURN
  4582. 43025 CALL GRAPHIC (USER.GRAPHIC.DEFAULT$,FILE.NAME$)
  4583. '
  4584. ' *  DISPLAY NON-BREAKABLE TEXT FILES
  4585. '
  4586. 43027 STOP.INTERRUPTS = TRUE
  4587.       CALL BUFFILE (FILE.NAME$,X)
  4588.       CALL CARRIER
  4589.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4590.          RETURN 10595
  4591.       STOP.INTERRUPTS = FALSE
  4592.       RETURN
  4593. '
  4594. ' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)
  4595. '
  4596. 45010 HIDDEN = TRUE
  4597.       GOSUB 12995
  4598.       HIDDEN = FALSE
  4599.       RETURN
  4600.